この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
よく訓練されたアップル信者、都元です。本日朝、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で記述できました。これは便利!