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名を指定してデプロイします。

以上!

オンライン無料相談

サーバーレスの悩み事、お気軽にご相談ください

サーバーレスオペレーションズの担当者がオンラインで皆さんのサーバーレスに関するご相談やお問い合わせに無料でお答えいたします。 カレンダー (Calendly) からお好きな日程をブッキングしていたくだけで、お申込みいただけます。

こんなお悩みや課題を
抱えていませんか?

  • サーバーレスでやりたいことがあるが
    何から始めていいかわからない
  • サーバーレスのアーキテクチャレビューをしてほしい
  • サーバーレスで進めようとしているが
    適しているのかわからない
  • クラウド技術習得やこれからのキャリアに迷っている
  • 社内でサーバーレスを広めたいがブロッカーがある
  • 新卒エンジニアだがサーバーレスの勉強を
    どうしたらいいのかわからない