知識のリンク集

技術系アウトプット

SAMでマイクロサービスインフラ環境構築

SAMとCloud Formationの違いは?

これはよく会話でごっちゃになっていたので整理。
SAMはCloud Formationの拡張機能

Cloud FormationはAWS リソースを正確に記述しつつそれらの関係性を表現することができるテンプレート仕様となっておりその分仕様が少しややこしい。
一方SAMはサーバーレス・アプリケーションを定義するためのものでありCloudFormationの機能を使いつつリソース間の関係性をより直感的に記述できるようになっている。

というまとめを下記記事より学んだ。
同じアーキテクチャをSAMとCloudFormationそれぞれで用意したテンプレートコードが掲載されており、SAMがいかに簡易化されているのかがわかる。
https://toris.io/2017/12/aws-sam-as-a-good-development-toolchain-for-serverless-apps/

手順
  1. アーキテクチャ図作成
  2. テンプレートファイル作成
  3. 実行&確認
1. アーキテクチャ図作成

最近は資料を作成する際にFigmaを活用することが多い。
今回の図もFigmaを使った。

f:id:yuri_iOS:20200406000840p:plain

実際にはテーブル名やLambdaのfanction名も記載する。
誰が開発を担当しても命名がずれないようにアーキテクチャを決める話し合いで決めておく。

GraphQLを使っているためにEndpointの入り口をわけていたり、CQRSを採用して書き込み用と読み取り用のDBをわけたりしている。

2. テンプレートファイル作成

事前準備として、SAMでサーバーレスアプリケーションを作成するにはテンプレートファイルをパッケージ化してデプロイするという流れ。
この時にAWS SAM CLIを使うのでインストールしておく。

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html


SAMのテンプレートはJSONYAMLでかけますがYAMLを採用。

テンプレートはCould Formationの最新のものをベースに、ファイルの冒頭にて "Transform: AWS::Serverless-2016-10-31" を宣言することでAWS CloudFormation テンプレートを AWS SAM テンプレートとして識別されるようにする。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-formats.html
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-specification-template-anatomy.html

Transform: AWS::Serverless-2016-10-31

Globals: 全体で共有する設定

Parameters: 変数定義
            例)環境によって処理をわけるためにENVを変数として定義しておく

Mappings: キーと名前付きの一連の値とが対応付けらる。
      例) 環境によって参照するAPIのパスを本番・STG・開発用と変える

Resources: スタックに含める AWSリソースを宣言


採用するリソースの記述方法と各プロパティは公式ドキュメントで確認
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-specification-resources-and-properties.html

3. 実行&確認

テンプレートファイルができたらsamのコマンドでパッケージ化&デプロイを行う。
この時デプロイ先としてS3にバケットが必要になるので作成しておく。

パッケージコマンド

sam package --template-file [template.yaml] --output-template-file [output-template.yaml]  --s3-bucket ${BUCKET_NAME}

デプロイコマンド

sam deploy --template-file [output-template.yaml] --stack-name [stack-name] --capabilities CAPABILITY_IAM --no-fail-on-empty-changeset --parameter-overrides Env="dev"

上記のコマンドをCircle CIなどで実行する際に読みやすいよう、あわせてMakeFileにコマンドを作成しておく。

deploy:
	sam package \
		--template-file template.yaml \
		--output-template-file output-template.yaml \
		--s3-bucket ${BUCKET_NAME}

	sam deploy \
		--template-file output-template.yaml \
		--stack-name [stack name] \
		--capabilities CAPABILITY_IAM \
		--no-fail-on-empty-changeset \
		--parameter-overrides Env="dev"

スタックとは関連リソースを単一のユニットとしてまとめたもの。
Cloud Formationの方にスタックについての記載がある。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-whatis-concepts.html#w2aab5c15b9

deployが成功するとAWS コンソールのCloud Formationにてスタックが確認できる。
SAMは一回成功すれば以降失敗してもロールバックしてくれるし差分だけ見て環境を構築しなおしてくれるらしい。