AWS CloudFormationってなんだ

Wed Dec 16, 2020 - aws
Sat Dec 19, 2020

前置き

AWS CloudFormationを業務でしこたま使うようになり、結構苦労しました。

何が大変って情報がない。いや、公式のドキュメントはあるのだけれど公式だけあってコテコテのAWS初心者には難しい。

かといって、「AWS CloudFormationの使い方」とググってもプログラミング初心者をターゲットにしたSEO記事やその系統のユーチューバーの動画ばかりで業務では全然使えない。大抵ここらの情報はAWSのコンソールからポチポチやってほらどうよみたいな記事ばかり。

実際の業務ではコンソールからポチポチすることなんてほとんどないし、流石にAWS初心者とはいってもこの程度のことは公式サイトのチュートリアルに書いてあるので詰まることはない。

問題は、実際の開発でCloudFormationをどのようにテンプレ化して開発をすればいいのかということ。

そして一生懸命ググって、有益だと思える記事を見つけても、その記事は結構できる系のエンジニアが書いてる記事で、ちょっと優しくない。これくらい知ってるよね。だから書いてないよ。みたいな感じで手順やらの情報が抜けてる場合が多い。

僕のイメージですけどこんな感じですね。明らかにプログラミング初心者を狙った下位情報マイクロサービスかつクラウドを使うようなモダンな開発現場にいる結構できる系の上位情報

この2極化。

なので、ちょうどいい感じのレベルの情報があんまりない。

というわけで、ちょうどいい感じレベルのAWS CloudFormationの記事を書くことにしました。

最低限を抑えておきたいコマンド

AWS CloudFormationを業務で使う場合はターミナルから作業することがほとんどなので、AWS CLI Command Reference(cloudformation)にあるコマンド集を頼りに作っていくわけですが、量が多いので、ここでは最低限を抑えておきたいコマンドを挙げてみます。

  • create-stack

  • update-stack

  • delete-stack

  • package

  • deploy

詳しいことは、公式のリファレンスをみてもらうとして、これらのコマンドのイメージはざっとこんな感じ。

packageコマンドdeployコマンドはスタックのネストやスタックの相互依存関係など、ちょっといろいろあるので、今回は書きません。たぶん次回書く予定です。

まずは、基本となるcreate-stackコマンドupdate-stackコマンドdelete-stackコマンドを抑えておきます。もうコマンドの名前からしてわかりやすいですが、スタックを作って、更新して、消すやつかなと思うでしょ。そうです。

この基本の3つのコマンドを使ってどのようにいい感じにスタックをテンプレ化すればいいのかというと枯れた技術を使っていい感じ便利にすることが重要です。

枯れた技術

AWSのようなナウい技術を使ってるのに枯れた技術を使うのと思うかもしれませんが、CloudFormationをテンプレ化する理由は日々の業務で同じ作業があり、それを少しでも楽にしたいからテンプレ化したいというのほとんどだと思います。

日々の作業という物は1年後、3年後、10年後も同じように必要となるはずです。なので、日々アップデートが必要な技術でこのテンプレ作業をするのはあまり得策ではありません。実際、CloudFormation自体もただのymlですし。

CloudFormationの参考になるテンプレなんかはAWS Labsを見ることが多いのですが、だいたいMakefileなどを使って、組み立てていることが多いです。

スタックのテンプレ化は一発で終わることはまずないです。IAMのポリシーやアクセス管理などはほぼ絶対何回も作ったり更新したり削除したりする作業が入ります。日々の作業を楽にするための作業は楽ではないということです

ということで、枯れた技術も使ってCloudFormationを作っていきます。

スタックをCloudFormationで作る

今回は単純なS3のバケットを作るスタックを作成します。ディレクトリ構造を以下のようにします。

1
2
3
4
5
.
├── Makefile
└── stack
    └── s3.yml
    └── parameters.json

バケットを作るだけの単純なs3.ymlを作る。ここで重要なのは変数のServiceですね。s3のスタックを作成時のコマンドを実行するとき共通の変数を与えられたら便利なので、このような感じでテンプレを作ります。

!Refとか!Subの使い方は公式リファレンスでもみてください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  Service:
    Type: String
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Delete
    Properties:
      BucketName: !Sub
        - ${ Name }-bucket
        - { Name: !Ref Service }
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true

s3に与える変数のServiceですが、これは別ファイルで管理しますので、parameters.jsonを作ります。

1
2
3
4
5
6
[
  {
    "ParameterKey": "Service",
    "ParameterValue": "bokunonikki"
  }
]

次はMakefileを以下のようにします。ここではスタックの名前がsampleで、それを変数に格納し、テンプレを使いまわせるようにしておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 変数
STACKNAME := sample

# スタック

## s3スタックの作成
.PHONY: create-s3
create-s3:
	@aws cloudformation create-stack --stack-name ${STACKNAME} \
		--template-body file://stack/s3.yaml \
		--parameters file://stack/parameters.json

## s3スタックの更新 
.PHONY: update-s3
update-s3:
	@aws cloudformation update-stack --stack-name ${STACKNAME} \
		--template-body file://stack/s3.yaml
		--parameters file://stack/parameters.json

## s3スタックの削除 
.PHONY: delete-s3
delete-s3:
	@aws cloudformation delete-stack --stack-name ${STACKNAME}

ここまでくればあとはターミナルからmake create-s3でスタックを作成を実行すればいいだけです。

AWSコンソールからcloudformationに行けばちゃんとスタックが作成され、S3にはbokunonikki-bucketというバケット名のバケットができているはずです。

あとは、望み通りのスタックができるまで繰り返しです。公式ドキュメントとにらめっこしながら。

S3のポリシーを変更する場合はmake update-s3すればいいし、間違ってスタックを作ってしまった場合はmake delete-s3で削除すればいいのです。ちなみですがS3のバケット名の更新はできないので間違って名前をつけてしまった場合は一度、削除する必要があります。

このサンプルはあくまでもサンプルです。ですが、これらのことをだいたい理解できれば、あとはオプションやらをうまい具合に組み合わせて作っていくだけです。

枯れた技術をうまい具合に使い、cliのオプションもうまい具合に使い、いい感じのテンプレを作っていきましょう。

参考になった本

Makeの本は、これ一冊あればことたりると思います。何かしたくなったら調べるくらいのレベルでも結構役に立ちます。

これは、個人的に面白かった本です。任天堂を世界的ゲームメーカーに育て上げた横井軍平氏の本です。枯れた技術を使って製造コストを抑えつつ、ユーザーに新しい体験をさせる工夫など面白みがある本でした。

そういえばアップルも最新技術を使うのではなく、ちょっと遅れてはいるが安定的な技術を使っていると聞いたことがあるし、枯れた技術、侮るなかれ。

See Also