質問: CloudFormationでlambdaのファンクションを追加するためのリソースを作りたいと考えています。 聞きたい事 ----- cloudFormationのテンプレートで、lambdaに必要な作業を1つのテンプレートにまとめて書くことはできませんか? 状況 -- CloudFormationの「AWS::Lambda::Function」で使うソースを指定する場合は、次の方法があります。 1. s3バケットにソースをアップして、Code属性にそのバケットの情報を追記する 2. CloudFormtaionに直接スクリプトを書いてしまう。 今回は、jsのライブラリを組み合わせて使うので、前者の方法で実装します。 この場合、バケット作成->lambdaのアップロード->スタック作成の順番で実施する必要があります。 私の調べる限り、CloudFormationでは、この3つの作業を1つのテンプレートに入れることは出来なさそうです。 `aws cloudformation package`で、s3のパスを指定した状態のテンプレートを生成(コンパイル?)する事ができる様ですが、バケットの作成までは自動化出来ないです。 テンプレート化したい一連の作業の詳細 ------------------ 下記の作業をCloudFormationのテンプレートに書いて、実行時に全て実行する。 * 任意のS3バケットを作成する * 作成したS3バケットに対してLambdaのソースコードをアップロードする * CloudFormationのテンプレートのCodeプロパティに上記の情報を適用する。 具体的にはResouceのPropertiesに下記を追加したいです。 ``` "Code": { "S3Bucket": <1.で作成したbucket名>, "S3Key": "<2.でアップロードしたファイル名>" } ``` ### イメージ ![構成イメージ](https://i.stack.imgur.com/1Mlda.png)
回答: SAMと`aws cloudformation package`を使うのが良いと思います。 例えば、下記の`template.yaml`の`CodeUri`のようにファイルのパスを指定します。 ``` $ grep Uri template.yaml CodeUri: LambdaFunctionOverHttps.py $ ls LambdaFunctionOverHttps.py LambdaFunctionOverHttps.py $ ``` `aws cloudformation package`で`template.yaml`とS3バケットを指定すると、 1. lambda関数をS3バケットにアップロード 2. `template.yaml`の`CodeUri`をS3バケットにアップロードしたS3パスに修正したcloudformationのテンプレートを出力 してくれます。 ``` $ aws cloudformation package --template template.yaml --s3-bucket lambda-zipfile > packaged-template.yaml $ grep CodeUri packaged-template.yaml CodeUri: s3://lambda-zipfile/7a1fd29b27ea23ac1cc381189182062b $ aws s3 ls s3://lambda-zipfile/7a1fd29b27ea23ac1cc381189182062b 2018-04-19 19:17:19 640 7a1fd29b27ea23ac1cc381189182062b ``` 出力されたテンプレートを`aws cloudformation deploy`すればlambda関数が作成されます。