AWS Lambda Python でMFA認証コードを作成してみる

はじめに

今回はAWS Lambda PythonでMFA認証コードを作成してみたいと思います。
あまり必要になることもないかと思いますが、試したら出来たので共有します!

準備

ライブラリ

今回は以下のライブラリを使わせてもらいます。
GitHub - pyauth/pyotp: Python One-Time Password Library
こちらのライブラリをpipでインストールする必要があるのですが、今回はLambdaで実装していくのでレイヤー化します。

ライブラリダウンロード

適当にdockerやらEC2やら立ててレイヤー化の作業を行います。
今回はAmazon Linux2のEC2を使いました。
インストール手順は以下となります。

sudo easy_install pip
mkdir python
pip install -t ./python pyotp
zip -r pyotp.zip python
aws -s mv pyotp.zip s3://バケット名/pyotp.zip

やっていることはライブラリをダウンロードしてS3バケットに配置しているだけです。

レイヤー化

マネジメントコンソールから[Lambda]→[レイヤー]→[レイヤーの作成]
名前は任意ですが、ここではpyotpとしておきます。
S3のリンクは先ほどライブラリを配置したパスを指定します。

f:id:rioner2525:20200326184646j:plain
こんな感じ

実装

AWS Lambda で準備したレイヤーを利用してMFA認証コードを作成します。
Lambda関数に先ほど作成したレイヤーを追加しておきます。

f:id:rioner2525:20200326195213j:plain
こんな感じ
Python のコード例は以下になります。

実行したら以下のような情報が出ます。

012345  #MFA認証コード
14  #コードが切り替わるまでの時間、30になったら切り替わる

おわりに

軽く解説します。
TOTPメソッド内の数字ですが、これはMFAのシークレットキーになります。
普通はQRコードでMFA登録を行うことが多いと思いますが、実はQRコードと同時にシークレットキーも払い出されています。

f:id:rioner2525:20200326192214j:plain
IAMでのMFAだとココ

これでサーバレスにMFA認証が可能となります。
主な利用ケースとしてはMFA認証を利用したCLIの操作でしょうか。
他にもスマホを持っていないガラケーユーザーがAmazon connectと連携したLambdaを電話コールで叩いてMFAコードを取得、MFA認証でログインするとか変則的な使い方もできそうです(`・ω・´)

API Gateway から直接S3バケットにアクセスしてみる

はじめに

API Gateway って裏にLambdaが定番だと思いますが、裏に配置できる物ってかなり多いんですよね。
f:id:rioner2525:20200228112532p:plain
Other AWS services とあるように API Gateway の裏に何でも配置できそうです。
Lambdaを介さないで済むなら、API Gateway から直接S3バケットにアクセスできた方がお金の節約になるなと思ったので記事にしておく次第です。

本題

API Gateway リソース設定

API Gateway を作成してリソースを作成しましょう。
ここでURLからS3バケットを指定できるように波括弧を使用してパスパラメータを使います。
リソースパスの部分に波括弧{}を追加するだけでよいです。
余談ですが...リソースパス下の情報では角括弧と書いてありますが角括弧は[]だと思っているので、この部分はAWSさんの記述ミスな気がしてます。 f:id:rioner2525:20200228114310j:plain
そしてアクセスしたいファイルの配置部分まで階層を指定できるようにリソースの下にさらにリソースを追加していきます。今回は3階層にしました。
f:id:rioner2525:20200228114916j:plain

API Gateway メソッド設定

ここからS3バケットのファイルにアクセスしたい方法に応じてメソッドを作成します。
今回はS3バケットにファイルを配置するため、PUTメソッドで作成してみます。
S3バケットからファイルをダウンロードしたい方はGETメソッドにしてください。

f:id:rioner2525:20200228120412j:plain
設定例はこんな感じです。

リソースの設定に応じてパス上書き部分は修正してください。
また、実行ロールにはS3に関するアクセス権限とAPI GatewayがアクセスできるPrincipal設定が必要です。

API Gateway リクエスト設定

ここまでの設定でメソッドリクエスのリクエストパスにそれぞれのリソースが自動で設定されているハズです。
f:id:rioner2525:20200228162607j:plain
では統合リクエスからこれらのリクエストパスを URL パス部分にマッピングしていきましょう。

f:id:rioner2525:20200228163618j:plain
この画像部分を編集していきます。

f:id:rioner2525:20200228163809j:plain
こんな感じにしましょう。

この設定を行うことでURLからきたパスをそのままS3バケットの階層として受け渡すことができるようになります。

S3バケットAPI Gateway 経由でアクセスしてみる

ここまでの設定でAPI Gateway から直接S3バケットにアクセスできる設定が完了しております。
というわけで早速アクセスを試してみましょう。
APIをデプロイして表示されるURLを叩いてみます。
※今回はパブリックAPIでデプロイしています。 f:id:rioner2525:20200228180051j:plain
f:id:rioner2525:20200228180143j:plain コピペ用

echo test > test.txt  
curl -XPUT -d test.txt https://API-ID.execute-api.ap-northeast-1.amazonaws.com/STAGE/bucket/key1/key2/key3  

このコマンドでtest.txtが指定したS3バケットの配置に格納されるハズです。
今回はtest.txtファイルをbucket/test/test2/test.txtのパスで叩いたので、その配置に格納されていました。

f:id:rioner2525:20200228180511j:plain
S3バケットに直接ファイルを格納できました

終わりに

API Gateway からLambdaを介さずに直接S3バケットにアクセスできました。
GASからAPIを叩くこともできるので私はGoogleスプレッドシートの内容をS3バケットjsonで送ったり、S3バケットから取得したファイルの情報をもとにスプレッドシートの内容を毎日自動更新したりといった感じで使っています。
Lambdaを叩かなくてよい分、多少コスト面でいい気分になれるので途中でファイルを加工する必要がなければ試す価値があるかと思っています!
以上です。

「コードクロニクル」レビュー

はじめに

はてなブログ今週のお題みたいなのがあるんですが、今回はプログラミング関連だったので初挑戦してみたいと思います。
今回は paiza(パイザ)さんのプログラミング学習ゲーム「コードクロニクル」を触ってみたのでレビューします。
コードクロニクル | RPG感覚でプログラミングが学べるゲーム

登録

コードクロニクルを始めるにはpaizaさんに登録する必要があるみたいです。
f:id:rioner2525:20200121182832p:plain
とりあえずGithubアカウントで登録。
メールが鬱陶しかったので速攻でメール配信設定はOFFにしました。
今回ははてなブログお題用に登録しただけなので(´-ω-`)スイマセン

コードクロニクル

paizaに登録して始めてみました。
最初に公式バナーにもいる3人のうちの1人を選べるみたいです。
f:id:rioner2525:20200121183854p:plain
真ん中のナイスミドルを選択しました。
f:id:rioner2525:20200121183934p:plain
お名前はアントニオさんというらしい。よろしく!1、2、3、ダー!
そして、このキャラクター詳細を見る限りコインUPというのがスキルみたいなものですね?
所属数とお別れ報酬は世界観的に大丈夫かとか少し不安もありますが進めます。

ガチャページは以下のような感じ。
f:id:rioner2525:20200121184759p:plain
王家の従者ガチャと城下の民ガチャと異形の森の住人ガチャがあるみたい。
そのうち、王家の従者ガチャはダイヤを使ってその他はコインを使うみたいですね。
ダイヤコインもクエストやミッションを進めると増えるようです。
課金要素もマルチ要素も無さそうなので、ソシャゲという感覚ではないです。

とりあえず異形の森の住人ガチャを回してみるぜ!
...
..
.
f:id:rioner2525:20200121185226p:plain
Rキャラエレク...さん?
城下の民っぽいですが異形の森の住人扱いなんですね...
まぁ森に住んでるなら間違いではないんでしょうが...何かかわいそう(;'∀')

次は城下の民ガチャを回してみるぜ!
...
..
.
f:id:rioner2525:20200121185748p:plain
Rキャラギルロスさん。特に言うことなし!

次は王家の従者ガチャを回してみるぜ!
...
..
.
f:id:rioner2525:20200121190256p:plain
SRキャラヴェルタさん。
最初に選べるうちの1人だった気がしますが...SRキャラなんですね。
コンプリートシートなるものを見てみるともう1人選べるメイドさんみたいなキャラもSRっぽい。(右上)
f:id:rioner2525:20200121190511p:plain
最初に選んだキャラはSSRになる...みたいな仕組みなんでしょうかね?
ちょっと分からないですがアントニオさんは選んでも損は無さそうです。

f:id:rioner2525:20200121191102p:plain
パーティーは5枠なのでもう1回異形の森の住人ガチャを引いたらまたエレクさんでした。草。
エレクさんが2人いるパーティを結成しましたが問題なし。(世界観とかは置いておいて。
ただ、パーティメンバーのスキルとかはないみたいなので、ゲーム的にパーティを組む意味も無さそうです。
唯一リーダースキルみたいなのだけ効果が適用されるみたいです。アントニオさんならコイン8%UP。

メインとなるプログラム勉強は現状PHPRubyPythonの3種類のようです。
f:id:rioner2525:20200121192930p:plain
f:id:rioner2525:20200121193116p:plain
とりあえずpythonで5章ぐらいまで進めてみました。
右上の魔力というのがミスってもいい回数で早く解くほどスコアが上がるようです。
スコアが高いほどもらえるコインやダイヤが増えます。

ストーリーのあらすじは公式引用で以下です。

豊かな自然に恵まれ、さまざまな種族が共存する穏やかな王国【パイザ】。
老若男女が魔法に親しむ平和なその国には、民たちから愛される姫がいた。
「古より伝わりし王家秘伝の魔導書をその手におさめよ」
父王から試練を与えられ、彼女は伝説の呪文が記された書を求め、今旅立つ。

5章まで進めた感じだとストーリーの進みが遅いな...って感じました。
何章まであるのか分からないですが先は長そうです。

肝心のプログラミング勉強としての部分ですが、初学者にはいいかもですね。
学習動画もありますし、ストーリーに興味があれば進める意欲も出るでしょうし。
ガチャのコンプリートシートを埋めよう!とか具体的な目標も立てやすそうです。
ただ、早解きコンボの要素はちょっと初学者的にはキツイかも?
ちゃんと理解しながら進められるようにデバッグの機能もあるといいのかなーとか思いました。(5章ぐらいだと数字の掛け算をしましょうぐらいのお題ですが)

キャンペーンまとめ

①paizaプログラミングスキルチェック内でコードクロニクルコラボ問題2問を正解すると抽選30名にAmazonギフト券1000円。
2問のキャンペーン期間が以下になってるのでもう無理かも!
1週目(Dランク問題) 2020年1月14日(火)12:00~1月21日(火)11:59
2週目(Cランク問題) 2020年1月21日(火)12:00~1月28日(火)11:59
f:id:rioner2525:20200121200247p:plain
https://paiza.jp/challenges

ツイッターでコードクロニクルを紹介したら抽選でAmazonギフト券1万円分を1名、500円分を50名にプレゼント。
応募期間:1月14日(火)~ 2月11日(火)
f:id:rioner2525:20200121183854p:plain
https://paiza.jp/codechronicle?hatena_collabo
このキャンペーンのイベント規約の(3)ですが...
(3)応募ツイートを投稿の際は、キャンペーンページの「参加方法」をよくお読みの上、ハッシュタグ・指定URLを含めた形式でご投稿下さい。また、同時に当社公式アカウント「@paiza_official」をフォローして下さい。
「参加方法」ってどこに書いてあるねん...ってなってます( ゚Д゚)
ハッシュタグはバナーにも書いてある「#コードクロニクル」でしょうが指定URLは...?
f:id:rioner2525:20200121201309j:plain:w300
ぜんぜんわからん...

一応予想ですが画像の赤枠部分からTwitterにシェアで良さそうな気がします。
f:id:rioner2525:20200121201948p:plain
問い合わせたら乞食としか思われないので問い合わせてはいませんw
間違ってたらすいません(´-ω-`)

以上です。

はてなブログ特別お題キャンペーン #学び応援WEEK

はてなブログ特別お題キャンペーン #学び応援WEEK
by ギノ

re:Invent 2019 に行ってきました

初めて re:Invent に行ってきました。
メッチャ長い社内レポートをかいていたりでクッソ激烈に遅くなりましたがメモを書いておきます。

Keynote

① Monday Night Live

www.youtube.com
・8:30ぐらい~
HPC(ハイ・パフォーマンス・コンピューティング)はこれまで専用のスパコンを決められた人たちが順番で使ってきたよ。HPCをクラウドでも利用できるようにAWSはインフラに投資を続けてきたよ。
・10:30ぐらい~
2013年の第一世代と比べて6年で20倍もネットワーク性能が向上したよ。
・19:30ぐらい~
HPCのネットワークではTCPは遅くて適していないよ。Nitro Controllerに最適化されたEFA(Elastic Fabric Adapter)を組み込むことで高速通信を実現したよ。
・45:00ぐらい~
機械学習ではクラスタが一定まで増えるとスループットが頭打ちとなってしまうよ。P3dnインスタンスGPUインスタンス)を使うことでパフォーマンスを向上できるよ。
・55:30ぐらい~
推論では汎用のプロセッサは向いていないよ。推論用のチップAWS Inferentiaを開発してスループットを向上させたよ。

② Andy Jassy

www.youtube.com
新サービスの話は各所で掲載されているので割愛します。
・2:30ぐらい~
一般企業の他にも世界中で7,000の政府機関、10,000の教育機関、25,000以上の非営利団体AWSを使用しているよ。
・5:00ぐらい~ 変革していかないといけないよ。変革は技術的な問題じゃなくてリーダーシップの問題だよ。変革のために必要なことは以下。
①リーダーたちが互いに信頼して足並みをそろえよう。
トップダウンに明確にゴールを決めよう。恐る恐るではなく積極的に動くべき。
③開発者に勉強させよう。クラウドは今まで誰も知らなかった分野だからラッキーだよ。
④変革を始める前にマヒ状態になって動けなくならないようにしよう。
youtubeだとカットされてる...
AWSクラウドマーケットのシェアは47.8%で1位。2位のMicrosoft(15.5%)を引き離しているよ。世界全体のITにかかる経費ではまだオンプレミスが97%でクラウドは3%。でも急速に伸びてるよ。
・41:00~ぐらい
最近のIT業界の変革。メインフレームからクラウドへ。オンプレのリレーショナルデータベースからAWSのデータベースへ。囲い込みのDBからAuroraへ。WindowsからLinuxへ。

③ Global Partner Summit

www.youtube.com
・4:00ぐらい~
コンサルティングパートナーとテクノロジーパートナーのどちらも数万社いるよ。毎日50以上の新しいパートナーが増えているよ。
・1:20:00ぐらい~
これからこのあたりができるパートナーは仕事が増えそう。
①分析ツール、専用のDBについて顧客環境にあったものを提案できる。モダンな開発環境ではRDBも使われなくなる。将来的なところまで考えて構築すること。
②IoTで機械学習を使う機会が多く出てくる。推論やログ分析から傾向をみたり。Sagemaker、Greenglassなどの知識が必要。

④ Werner Vogels

www.youtube.com
・8:00ぐらい~
仮想化環境をマイクロサービスのアーキテクチャにすることで低レイテンシでセキュリティ強度の高いインフラ(Nitro System)を構築したよ。
・13:00ぐらい~
Nitro Systemを搭載したC5系のインスタンスはベアメタルと同程度のパフォーマンスを発揮できるようになったよ。
・49:00ぐらい~ EBSの内部的なアーキテクチャをシャッフルシャーディングの原則を用いて分散型のマイクロデータベースとしたことで、EBSは信頼性の高いストレージサービスになったよ。

EXPO で珍しいと思ったノベルティみたいな

EXPOはAWSスポンサーブースが出展してるところです。
珍しいなーと思ったやつ貼っておきます。
①黒地のTシャツに選んだ柄をその場でプリントしてプレゼントしてくれるノベルティ。好みに合わせて選べるので受け取ってもらいやすい気がしました。
f:id:rioner2525:20191218212935j:plain
②その場で似顔絵を描いてくれるノベルティ。かなりクオリティ高かったので普通にお金取ってる気がします。少なくともチップはだいぶ弾まないとダメそうな気がした。
f:id:rioner2525:20191218213132j:plain
③ガチコーヒーメーカーでその場で淹れてくれる。カッコいい。あとこれはHITACHI様でした。さすがです!一生ついていきます!!!
f:id:rioner2525:20191218213524j:plain
④UFOキャッチャー。えぇ...。
f:id:rioner2525:20191218213626j:plain
ライトセーバー。みんなメッチャ笑顔でもらってました。最終章の映画も決まりましたし、みんな好きなんすね~。
f:id:rioner2525:20191218213741j:plain

その他

AWS Summit Tokyo でもあったような遊ぶスペースがこちらでもありました!
rioner2525.hatenablog.com
re:Invent ではみんな笑顔で遊んでいてやっぱり東京の人たちと全然違うな...と肌で感じました。
f:id:rioner2525:20191218214006j:plain

おわりに

メモ少なくてすいません...ユルシテ...

以下感想ですが、初めてラスベガスに行きましたが楽しかったです。
軽く観光にも行きましたが、すべてのスケールが大きく大袈裟な感じ。
道行くお兄さんお姉さんの恰好も過激だったりしました。
あとAWSの会場で出た食事は微妙だった気もしました...が、ちゃんとしたお店でステーキ食べたらメッチャおいしかったです!肉サイコー!
f:id:rioner2525:20191218214113j:plain

Amazon API Gateway でプライベートAPIの呼び出しが簡単にできるようになった

はじめに

最近、API Gateway のコンソール変わったな~
なんかいい感じのアップデートがあったんだろうか...と思って調べてみたところ、タイトルのアップデートがありました。
Amazon API Gateway で Private API の呼び出しを簡素化
内容はプライベートDNSが無効でも下記のURLでプライベートAPIにアクセスが可能になったということらしいです。
https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
Amazon API Gateway
このアップデートは以前記事にした内容と関係してて気になったので確かめてみました。
rioner2525.hatenablog.com

動作確認準備

デフォルトのLambdaを用意

f:id:rioner2525:20191127135401j:plain
そういえばPython3.8が実装されてましたね...

VPC エンドポイントを用意

VPC エンドポイントは今回のアップデートの効果を確かめるためにプライベート DNS 名が無効のものを用意。
(有効だと今回のアップデートに関係なく普通にプライベートAPIを呼び出せます。)
f:id:rioner2525:20191127114807j:plain

プライベートAPIを用意

先ほど作成したデフォルトのLambdaを実行するだけのプライベートAPIを作成。
テストなのでリソースポリシーは全開けでセキュリティガバガバにしました。
f:id:rioner2525:20191127131710j:plain

動作確認

今回のVPCエンドポイントにアクセスできるEC2インスタンスから作成したプライベートAPIにアクセスしてみます。

普通にアクセスしてみる。

curl https://{rest-api-id}.execute-api.ap-northeast-1.amazonaws.com/{stage}/
DNS名が有効ならこれでアクセス可能ですが...
f:id:rioner2525:20191127133145j:plain
このままではアクセスできません。予定通り。

URLにVPCエンドポイントIDを付け足してアクセス

アップデートの内容通り、VPCエンドポイントIDを付け足してアクセスしてみます。
https://{rest-api-id}-{vpce-id}.execute-api.{region}.amazonaws.com/{stage}
f:id:rioner2525:20191127133734j:plain
アクセスできました!

おわりに

このアップデートによってプライベートDNSが無効のVPCエンドポイントでも簡単にプライベートAPIにアクセスすることが可能になりました。
自分もヘッダーに色々付けるのがめんどくさいなぁ...と思っていましたが結構そう思ってる企業様がいて、対応したって感じなんでしょうかね?

でも、このアップデートによりますますプライベートDNSは有効より無効の方がメリットがある気がしてきました。
ドキュメントでは有効が推奨ってなってましたが、このアップデートで変わってるんじゃなかろうか...?
f:id:rioner2525:20191127134650j:plain
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-apis.html
_(┐「ε:)_ズコー
このアップデートが入ってもまだプライベートDNSは有効が推奨なんですね...
まぁAWSさんが推奨って言ってるから~とか言ってよく読まずに障害起こしちゃうのは私だけでしょうから問題ないっす!
以上