AWS Lambdaのデプロイ管理についての記事が、Serverlessなど他のアプリを使ったものが多かったのですが、AWSのコマンドだけでシンプルに実現する方法を考えました。
フローとしては、GithubにコードをPushすると、CIがシェルをたたき、CloudFormation経由でLambdaにデプロイするというふうになっています。(私の場合はCIはCircleCIを使っていますが、なんでも大丈夫だと思います)
CIがたたくシェルはこんな感じです。当方Rubyを使っているので、erbコマンドでyamlファイルに書くLambdaの環境変数を、ベタで書かずCIの環境変数で指定できるようにしています。(erbはrubyをインストールしてたら使えるはず)
deploy.sh
#/bin/sh
erb template-base.yml > template.yml
zip hoge.zip hoge.py
aws cloudformation package --template-file ./template.yml --s3-bucket "S3バケット名" --output-template-file ./packaged-template.yml
aws cloudformation deploy --template-file ./packaged-template.yml --stack-name "cloudformationスタック名" --capabilities CAPABILITY_IAM
template-base.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
Hoge:
Type: 'AWS::Serverless::Function'
Properties:
Handler: 'hoge'
Runtime: 'hoge'
Role: 'hoge'
CodeUri: 'hoge.zip'
Environment:
Variables:
ACCESS_KEY_ID: <%= ENV['AWS_ACCESS_KEY_ID'] %>
SECRET_ACCESS_KEY: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>