AWS Serverless Application Model (SAM) と CircleCI を使ったサーバーレスアプリケーションのデプロイフロー

セクションナイン吉田真吾@yoshidashingo)です。

Serverless Advent Calendar 2016の5日目です。

今日はCircleCIを使って簡単にSAMの自動デプロイフローを作ってみましょう。

f:id:yoshidashingo:20161205131449p:plain

準備

準備の流れは以下のとおり

  1. GitHubリポジトリを作成してCircleCIのプロジェクトとひもづけておく
  2. ソースコード(index.js)を用意する
  3. IAM Userのクレデンシャルを用意する
  4. リリースステージ用のS3バケットを作成する
  5. app-spec.ymlを用意する
  6. circle.ymlを用意する
  7. CircleCIのプロジェクトにAWSのクレデンシャルと環境変数を設定する

1. GitHubリポジトリを作成してCircleCIのプロジェクトとひもづけておく

適当にGitHubリポジトリを作ってください。今回のサンプルは最終的に以下のような構成になります。

├── README.md
├── app-spec.yml
├── circle.yml
└── index.js

サンプルはここに置いておきます。

github.com

できたらCircleCI側でもこのリポジトリに紐づくプロジェクトを作っておきます。

※template.yaml = app-spec.yml

2. ソースコード(index.js)を用意する

今回作るのは以下のSAMのサンプルのAPI Backendを参考にします。

https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/api_backendgithub.com

3. IAM Userのクレデンシャルを用意する

7でCircleCIのプロジェクト設定に追加するCloudFormation用のIAM Userのクレデンシャル(Access Key ID と Secret Access Key)を用意します。 権限は今回省略しますが適宜つけておいてください。

4. リリースステージ用のS3バケットを作成する

作成するAPIバックエンドと同一のリージョンにソースコードリリースステージ用のバケットを作成してください。

5. app-spec.ymlを用意する

SAMの定義ファイルを作成します。

6. circle.ymlを用意する

7. CircleCIのプロジェクトにAWSのクレデンシャルと環境変数を設定する

  • Project > AWS Permissions に Access Key ID と Secret Access Key を設定します。
  • Project > Environment Variables に以下の環境変数を設定します
    • REGION : スタックを作成するリージョン、ap-northeast-1 とか
    • S3_BUCKET_NAME : 4で作ったコードをステージするS3バケット名
    • STACK_NAME : CloudFormationのスタック名、適当につけて大丈夫です。

実行

GitHubにPushすれば

CircleCIが回って f:id:yoshidashingo:20161205022824p:plain

CloudFormationが動いて f:id:yoshidashingo:20161205022942p:plain

APIバックエンドができました。 f:id:yoshidashingo:20161205022756p:plain

最後に

SAMに限らずサーバーレスアプリケーションを構築するフレームワークの多くが手元から簡単に使えますが、PR駆動なチーム開発をしようとした場合にはこういったCIのサービスと連携する必要が出てきます。当初このフローも先日リリースされたばかりのCodeBuildを利用してみようと思いましたが、7で設定したような環境変数が設定できなさそうだったので、使い慣れたCircleCIをベースにやってみましたが、日々ツールは進化するので、定期的に見直すことで開発フローをよりよくしていきたいですね。