概要
Lambda関数デプロイ自動化に向けたCloudFormationによるLambda関数のデプロイ
※この記事の目標はS3においてあるpythonのzipファイルからLambda関数を作成するところまでです。
2018-11-15更新
プロパティについて詳しくまとめた記事書きました
AWS::Lambda::Functionのプロパティ
参考資料
基本は公式ドキュメントを参考にする
準備
1.Lambda関数にするpythonファイル
無駄にゴリゴリ書いても余計な考えが入っちゃうので今回はシンプルに↓こんなん
# coding: utf-8
def lambda_handler(event, context):
print "OK!!"
2. zipファイル
先程のtest.pyをzip形式で圧縮して,任意のS3のバケットにアップロードする
3. テンプレートファイル準備
公式ドキュメントによるとAWS::Lambda::Function
に必要なプロパティは下記のようになっている(JSON)
テンプレート
{
"Type" : "AWS::Lambda::Function",
"Properties" : {
"Code" : Code,
"DeadLetterConfig" : DeadLetterConfig,
"Description" : String,
"Environment" : Environment,
"FunctionName" : String,
"Handler" : String,
"KmsKeyArn" : String,
"MemorySize" : Integer,
"ReservedConcurrentExecutions" : Integer,
"Role" : String,
"Runtime" : String,
"Timeout" : Integer,
"TracingConfig" : TracingConfig,
"VpcConfig" : VPCConfig,
"Tags" : [ Resource Tag, ... ]
}
}
ここからとりあえず必要なものを残すと↓
{
"Type" : "AWS::Lambda::Function",
"Properties" : {
"Code" : Code,
"Description" : String,
"FunctionName" : String,
"Handler" : String,
"Role" : String,
"Runtime" : String,
}
}
プロパティの説明
- Code (必須項目)
- バケット内のファイルを指すことも、ソースコードをインラインテキストとして指定することもできます。
- バケット内ファイル指定
- S3Bucket: zipファイルを配置したバケット名を入れる
- S3Key: zipファイル名(拡張子までつける)
- バケット内ファイル指定
- バケット内のファイルを指すことも、ソースコードをインラインテキストとして指定することもできます。
- Description
- 関数の説明
- FunctionName
- 関数の名前
- ここを指定しない場合,AWS CloudFormation は一意の物理IDを生成し、そのIDを関数名とするので,設定しておいたほうが良いでしょう
- 関数の名前
- Handler (必須項目)
- Lambdaがコードの実行を開始するために呼び出す (ソースコード内の) 関数の名前
- Role (必須項目)
- AWSサービスにアクセスするコードを実行するときにLambdaが引き受けるIAM実行ロールのARN
- ※ここだけ自分で作ったRoleだとうまく実行できなかったので公式ドキュメントのサンプルを参考にしました
- ※ここだけ自分で作ったRoleだとうまく実行できなかったので公式ドキュメントのサンプルを参考にしました
- AWSサービスにアクセスするコードを実行するときにLambdaが引き受けるIAM実行ロールのARN
- Runtime (必須項目)
- アップロードするLambda関数のランタイム環境
4. 以上とドキュメントからテンプレートファイルを作成する
※任意のところには**※(米印)**を入れておきます。
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "※sample of cloudformation template for deploying a lambda function form S3.",
"Resources" : {
"※HelloSample": {
"Type" : "AWS::Lambda::Function",
"Properties" : {
"Code" : {
"S3Bucket" : "※S3のバケット名",
"S3Key" : "※test.zip"
},
"Description" : "※test deploy lambda template",
"FunctionName" : "※test_lambda_function",
"Handler" : "※test.lambda_handler",
"Role" : { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] },
"Runtime" : "python2.7",
}
},
"LambdaExecutionRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [{ "Effect": "Allow", "Principal": {"Service": ["lambda.amazonaws.com"]}, "Action": ["sts:AssumeRole"] }]
},
}
}
}
}
5. CloudFormationでスタック作成
5-1. テンプレートをAmazonS3にアップロード
5-2. 詳細の設定
スタックの任意の名前を入力する
※今回は test-deploy-lambda-function
という名前に設定します。
5-3. オプション
特にデフォルトのままでいいが,タイムアウトのみ念のため,設定する(5分くらい)
5-4. 作成
以上の設定で 作成
ボタンを押下する
以上
確認
作成ボタンを押してすぐにスタックの詳細画面に行くと既に,Lambda関数をdeployしてくれている様子
![スクリーンショット 2018-11-13 21.47.33.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F133737%2F2adc701f-2297-7882-8291-3577a02dc925.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=aa5eb06585a1e2f8943d234e8a6c7aec)
指定した名前でLambda関数が作成されているか
![スクリーンショット 2018-11-13 21.48.15.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F133737%2Fe24e28ff-7280-470d-a04a-e49c3a07da33.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=8dfa9d717bc176859587592ee244fe7f)
中身はtest.pyの内容か
![スクリーンショット 2018-11-13 21.49.05.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F133737%2F559840a4-cdb8-3c4b-4e62-4591279c2e2c.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=2ac1f62479162e3972b05234d43460ab)
Handlerも指定したものになっているか
![スクリーンショット 2018-11-13 21.49.05 2.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F133737%2Fc34f0018-0734-e4b3-1b2e-2ca153d45ff8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5da867e803b00dafb26c715a9a7aaf76)
おわり
今回は全然実践的ではなく初歩になってしまいましたが,ここまでたどり着くのに3日間くらいかかったのでとりあえずここまでできればあとはテンプレートのプロパティ駆使して実践的なことができるようになるかと....
何かの参考になれば