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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

よく訓練されたアップル信者、都元です。本日朝、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で記述できました。これは便利!