Blog 開発ブログ

Blog

Serverless Frameworkを使ってビルド環境とデプロイ環境が分かれている場合のパイプラインを考える

概要

AWSを使ってサーバーレスアプリケーションを開発する際に、企業のコンプライアンスによっては特定のデプロイサーバ以外からのデプロイが禁止されている場合があります。
そのケースではCircleCIやCodeBuildなどの環境でテストとパッケージングを実施。デプロイのみをデプロイサーバから実施することになるでしょう。

その際にどのようにパイプラインを構成するか考えていきます。

構成

状況に応じて様々な構成が考えられるかと思いますが、以下のような構成を考えてみました。
1. ビルド環境でテストを行い、Serverless FrameworkにでソースコードのアーティファクトとCloudFormationを生成
2. それらをS3バケットに送信
3. デプロイサーバからaws-cliを使ってCloudFormationスタックを作成してデプロイ

Untitled (1).png

ビルド

僕がよくやるケースですが、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名を指定してデプロイします。

以上!

サーバーレスで
クラウドの価値を最大限にMaximize the cloud value with serverless

Serverless Operationsはこれまでグローバルの第一線で培ってきたクラウド技術(AWS − アマゾンウェブサービス)の豊富な実績と知見を活かし、お客さまのサーバーレスに関するさまざまな課題を解決します。