初Qiitaです。
いろいろ不慣れな点はありますが、お手柔らかにお願いします。
前提
めっちゃ深く掘り下げるものではないです。
「Lambdaってこんなものなんやなー」っていうのが理解できるレベルを目指します。
私、社会人7年目ですが、AWSも2012年から使ってきたものの、実はこれまでEC2メインで使ってきました。
(C#/ASP.NETのWebアプリ開発)
ところがベトナムに海外転職して、ちょうど新規プロダクトの開発を始めることになったので、AWSラブな私としてはLambdaを使おう、となりました。
AWS Lambdaって?
いろいろ詳しいことは他記事に譲りますが、一言で言うと(言えるかな?)
難しいサーバー構築などなしに簡単にアプリのコードが動く!
といったところでしょうか。
たとえコードを書いても、何かしらそれを実行するための環境も必要です。
Webアプリの例だと、(物理的な、もしくはクラウドの)サーバーマシン、OS、Webサーバー(NginxやApache)、ランタイム(PythonやNode)…
そして、OSを用意するということは、自分でメンテナンスをする必要性もあります。
これがまた面倒…
なので、コードを動かすだけのプラットフォームがあれば…あっ、Lambdaがある!
簡単に作ってみる
実際に書いてみましょう。
AWSコンソールにログイン
AWSアカウントはご用意ください。
無料で作れます。
また画面はEnglishになっていますが、お好みで。
リージョンは東京を選んでみました。
(会社では本番にSingapore、ステージングにSydneyを使っているので、誰も使っていないという理由だけです。)
Lambda management console
All servicesの下のComputeの下に、Lambdaがあるので、クリックします。
Create functionをクリックすると、どのように作るかが表示されますが、最初から書いてみようと思うので、Author from scratchを選び、画面の項目を埋めていきます。
-
Runtime
お好きな言語で。今回は私が慣れてきたPython3で書いてみます。 -
Role
いろいろ選択肢があります。- Choose an existing role
既にあるRoleを使いたい場合は、これを選択して、下のExisting roleで選びます。 - Create a new role from one or more templates
新しいロールを、テンプレートから選べます。今回はこれを使ってみます。 - Create a custom role
AWSのロールを自分で作れます。詳しい方はこちらを使ったほうが早そうですね。
- Choose an existing role
2つめのオプションを選ぶと、ロール名と、テンプレートを選べます。
- Policy templates
選択肢がかなりありますが、今回は「Simple microservice permissions」にしてみます。
足りなくなったらあとでRoleを編集しちゃおう。
すべての項目が埋まったので、右下の「Create function」をクリック。
ファンクション画面
関数ができました。
Scratchといいつつ、少しだけコードを書いてくれています。
ちょっとだけ解説
エディタの上の方に、3つほど設定するところがあります。
- Code entry type
Lambdaのコードをどのように格納するかを選べます。- Edit code inline
エディタでコードを編集できます。
インラインエディタでは、3MBまでの関数しか扱えません。これ以上の場合は、下2つのオプションしか使えません。 - Upload a .zip file
Zipファイルをアップロードして、Lambdaに格納できます。 - Upload a file from Amazon S3
ストレージサービスS3に保存したZipファイルをLambda関数として格納できます。
- Edit code inline
- Runtime
この関数を動かすランタイムを選べます。
昔はNode, Pythonしかなかった記憶がありますが、いつのまにかどんどん増えてます。 - Handler
Lambda関数が動くときに、どのファイルのどの関数を実行するか、を指定します。
初期値ではlambda_function.lambda_handler
となっていますが、これは「lambda_function.py」というファイルの「lambda_handler」という関数を指定していることになります。
Handlerとソースコードの関係についてちょっとだけ
Handlerで指定する関数には、必ず以下の2つの引数を設定しなければなりません。
足りなければエラーになります。
- 1つ目(慣例的に
event
)
実行時に渡すイベントが入ってます。
Nodeであれば{}
(ディクショナリ)、Pythonであればdict
の形で入ります。 - 2つ目(慣例的に
context
)
ランタイム情報が入っています。
Pythonでの例
申し訳ないんですが、私は使ったことがないです。
では、ひとまず動かしてみましょう。
Test
右上のTestをクリックすると、イベントの設定画面になります。
ここで指定したdict
型のオブジェクトが、Handlerで指定した関数の1つ目の引数にそのまま入ります。
ここでは初期値のままにしてみます。
Event nameに好きな名前を指定して、Createをクリック。
すると元の画面に戻りますが、右上のTestボタンの左には、先程作ったテストのイベント名が表示されます。
このまま、Testをもう一度クリックします。
成功しました。
赤枠の部分に、出力が表示されます。
今回、関数の戻り値は次のような内容だったため、そのまま表示されました。
return {
"statusCode": 200,
"body": json.dumps('Hello from Lambda!')
}
では、event
を表示してみましょう。
return {
"statusCode": 200,
"body": json.dumps(event)
}
インラインエディタでも、多少はコード補完をしてくれます。
これを右上のSaveで保存してから、Testをクリックして実行すると…
戻り値の内容が変わりました!
テストイベントを以下のように変えてみます。
{
"name": "Ken'ichi Ogawa",
"age": 29,
"company": "AnyMind Group"
}
すると実行結果も…
ちゃんと変わりました。
次回予告
せっかく書いたファンクションも、毎回Consoleから呼び出しているだけでは活用しきれていません。
いろんな呼び出し方について、記事を書いていきます!
次回:Lambdaでお手軽サーバーレス入門(呼び出し元のまとめ編)