AWS Lambda FunctionをCloudFormationで定義できるようになったのでやってみた

よく訓練されたアップル信者、都元です。本日朝、CloudFormationのドキュメントで大量の新リソースサポートがアップデートされました。

screenshot_2015-06-12_12_05_48

とりあえず、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バケットは東京に作りましたが、クロスリージョンで問題なくデプロイ可能でした。

screenshot_2015-06-12_12.20.19

何事も問題なく、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で記述できました。これは便利!