世間ではLambdaをデプロイするのにapexを使うのがいいかcloudformationを使ってデプロイするのがいいか、みたいな話があると思いますので、cloudformationでのデプロイ方法をここに書くことでその判断の一助になれば、及び、世間ではcloudformation packageコマンドの認知度が低い感じがするのでそれについてももっと知らしめたいという感じでこのエントリ書いてます。
公式ドキュメント
package — AWS CLI 1.15.10 Command Reference
簡単な例での解説
ファイルの準備
以下のディレクトリ構造だったとします
├── template.yml // cloudformationのyamlファイル ├── build └── lambda-go // `$ GOARCH=amd64 GOOS=linux go build` とかでビルドされてできたバイナリ
template.ymlの単純な例(これは簡単のためAWS SAMを使っていますが、aws cloudformationコマンドでもだいたい考え方は一緒で、ただ以下 CodeUri
の代わりに Code
を使う感じになります)
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: xxxxxxxxxx: # 好きな名前をどうぞ Type: AWS::Serverless::Function Properties: Handler: lambda-go # 上記バイナリのファイル名 Runtime: go1.x CodeUri: build # 上記lambda-goが存在するディレクトリ名
また、別途、成果物をuploadするためのS3バケットを作っておく必要があります。
デプロイ
まず、以下コマンドによってファイルをS3にuploadし、上記CodeUri部分をS3のURLに書き換えたcloudformationのtemplateファイル(output.yml)を生成します。
$ aws cloudformation package \ --template-file template.yml \ --s3-bucket $(上記成果物をuploadするためのS3バケット) \ --s3-prefix $(S3バケット内でプレフィックスをつけたかったらこれを指定) \ --output-template-file output.yml
そして、以下コマンドによって、上記コマンドで生成された output.yml
を使用してLambdaがデプロイされます
$ aws cloudformation deploy \ --template-file output.yml \ --stack-name $(CloudFormationのスタック名(任意)) \ --capabilities CAPABILITY_IAM
めでたしめでたし。
上記の仕組みが使われているMakeflieとCloudFormationのyamlファイルの紹介
動いている様子は以下リポジトリの template.yml
及び Makefile
で見ることができます。さっきもデプロイ成功しました。
Makefileの中身を見ても aws-sam-localコマンドはあるけどaws cloudformationが出てこないじゃないか
、という話はありますが、これは aws cloudformation
コマンドの代わりに aws-sam-local
コマンドを使用している、という理解で大丈夫ですので、入れ替えてもらって大丈夫です。
Go以外のデプロイ
- 基本的には上記と同じでPythonやNodeも、Zipファイルさえ作ってしまえば後は上記Goと同様にできるはずです(Nodeはやったことないけど)