概要
AWSを使ってサーバーレスアプリケーションを開発する際に、企業のコンプライアンスによっては特定のデプロイサーバ以外からのデプロイが禁止されている場合があります。
そのケースではCircleCIやCodeBuildなどの環境でテストとパッケージングを実施。デプロイのみをデプロイサーバから実施することになるでしょう。
その際にどのようにパイプラインを構成するか考えていきます。
構成
状況に応じて様々な構成が考えられるかと思いますが、以下のような構成を考えてみました。
1. ビルド環境でテストを行い、Serverless FrameworkにでソースコードのアーティファクトとCloudFormationを生成
2. それらをS3バケットに送信
3. デプロイサーバからaws-cliを使ってCloudFormationスタックを作成してデプロイ
ビルド
僕がよくやるケースですが、GitHubでリリースタグを作ったタイミングでリリース用のパッケージを生成します
$ git tag 1.0.0
$ git push origin 1.0.0 # この後、ビルド環境上でバージョン1.0.0のパッケージを作成する
パッケージングとCloudFormationテンプレートの生成はserverless package
コマンドを使いますが、デフォルトのままですと、バケットは自動生成されデプロイパッケージのプレフィックスは時刻になります
このバケット名とパス名をコマンドラインから指定できるようにServerless Package Customizerプラグインを使用します。バケット名には予め作ったバケット名と、パス名にはタグ名(バージョン名)を指定します
注) プレフィックスが時刻になるのはserverless rollback
コマンドのためです。プレフィックスを書き換えるとこのコマンドが使えなくなるのに注意してください
以下がパッケージを生成するためのスクリプトです。packageは.serverless
配下に出力されるため、s3 sync
でデプロイ用バケットに送信します
$ npx serverless package --s3-bucket ${DEPLOYMENT_BUCKET} --s3-path ${CIRCLE_TAG} --stage production
$ aws s3 sync .serverless/ s3://${DEPLOYMENT_BUCKET}/${CIRCLE_TAG}
デプロイ
以上で、S3にソースコードとCloudFormationが出来上がったので、デプロイサーバからaws-cliでCloudFormationスタックを生成します。
$ aws cloudformation create-stack --stack-name <スタック名> --template-url https://s3-ap-northeast-1.amazonaws.com/<バケット名>/<tag名>/cloudformation-template-update-stack.json --capabilities '["CAPABILITY_IAM","CAPABILITY_NAMED_IAM"]'
2回目以降のデプロイではupdate-stack
で該当バージョン番号のtag名を指定してデプロイします。
以上!