AWS Lambda FunctionをCloudFormationで定義できるようになったのでやってみた
よく訓練されたアップル信者、都元です。本日朝、CloudFormationのドキュメントで大量の新リソースサポートがアップデートされました。
とりあえず、AWS::Lambda::Function
が一番嬉しかったので、これを試します。
まずはFunctionの実装を用意する
もうなるっべく簡単な奴にします。入力オブジェクトのdata
プロパティとして、Base64エンコードされたデータを受け取り、それをデコードして返す関数です。
console.log('Loading function'); exports.handler = function(event, context) { console.log(JSON.stringify(event, null, 2)); var payload = new Buffer(event.data, 'base64').toString('ascii'); context.succeed(payload); };
このコードをDecodeBase64.js
として保存し、base64decoding-1.0-SNAPSHOT.zip
というzipファイルに固めました。そしてS3にアップロード。
っていう作業はみんなはしなくていいです。publicな状態で下記に置いておきました。
- バケット名:
cm-public-lambda-functions
- キー
base64decoding/base64decoding-1.0-SNAPSHOT.zip
CloudFormationテンプレートを書く
とりあえずこんな感じ。ロールは必須のようなので(今回はfunction内からAWS APIを叩くことはありませんが)PowerUserAccessのロールを作っています。
その上で、Functionの定義です。特に難しいことはありませんね。
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Lambda sample environment template", "Resources": { "LambdaRole" : { "Type" : "AWS::IAM::Role", "Properties" : { "AssumeRolePolicyDocument" : { "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] } ] }, "Path" : "/", "ManagedPolicyArns": [ "arn:aws:iam::aws:policy/PowerUserAccess" ] } }, "MyLambdaFunction": { "Type" : "AWS::Lambda::Function", "Properties" : { "Code" : { "S3Bucket" : "cm-public-lambda-functions", "S3Key" : "base64decoding/base64decoding-1.0-SNAPSHOT.zip" }, "Description" : "decode base64 function", "Handler": "DecodeBase64.handler", "Role" : {"Fn::GetAtt" : [ "LambdaRole", "Arn" ] }, "Runtime" : "nodejs" } } } }
Create-Stackによりデプロイする
で、まだLambdaは東京リージョンに来ていません。従って、CloudFormationスタックは現時点ではバージニア、オレゴンまたはアイルランドに置く必要があります。お好きなところで。
ちなみに、上記S3バケットは東京に作りましたが、クロスリージョンで問題なくデプロイ可能でした。
何事も問題なく、5分程度でデプロイができました。Resourecesタブから、Lambda Functionの PhysicalIDを確認して控えておきましょう。
実行する
FunctionのinvokeはAWS CLIからやってみました。--function-name
の部分は、上で控えた関数のIDです。
$ aws --region us-east-1 lambda invoke --function-name base64decoding-MyLambdaFunction-1WW7GXOV7PBJF --payload '{ "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0IDEyMy4="}' result.txt
その結果、下記のような標準出力がありつつ、
{ "StatusCode": 200 }
result.txt
に結果が格納されています。
$ cat result.txt "Hello, this is a test 123. :-)"
まとめ
以上、AWS LambdaのデプロイがCloudFormationで記述できました。これは便利!