CloudFormationでIaCを実践

AWSでIaC(Infrastructure as Code)といえばCloudFormation。AWSでシステムを構築する上でとても便利なサービスなので、本記事ではCloudFormationの使い方や使う際のコツを紹介していきます。

CloudFormationとは

AWSのマネージドサービスを使う場合は、AWSコンソールからGUIで作っていくのがまずは基本です。GUIで作れるのはとても便利なのですが、反面以下のような課題があります。
・使うサービスの量が増えると、1個1個全部GUIで作るのが大変になる
・細かい設定内容を忘れ、環境ごとに微妙に違う設定になりがち
・コンソールのUI変更により、以前と同じ手順で設定できなくなる

CloudFormationを使うことで、これらの課題を解消できます。CloudFormationはAWSが提供するIaC(Infrastructure as Code)のサービスで、大部分のAWSサービス作成・設定をコード化することができます。上記の課題に関しては、具体的には以下のように改善されます。
・使うサービスが増えても、前に作ったものをコピペして簡単に拡張できる
・同じコードを別々の環境に適用し、環境ごとの設定ずれを予防できる
・コンソールのUI変更による影響を受けない

CloudFormationの使い方

例えばS3バケットを作成したいとなった場合、CloudFormationを使って以下のステップで作成することができます。

①CloudFormationテンプレートを準備する
jsonとyamlの2種類の形式がサポートされていますが、可読性が高いので個人的にはyamlがおすすめです。

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "s3-cf-test-meat9"

②AWSコンソールからCloudFormation Stackを作成する
CloudFormationはStackという単位でリソースを管理します。ざっくりとは、1つのテンプレートファイルで1つのStackを定義するようなイメージです。コンソールのCloudFormationのページで「Create Stack」のボタンを押し、ナビゲーションに従ってStackを作成すれば、テンプレートで定義したリソースを作成することができます。

画像1

Stackのステータスが「CREATE_COMPLETE」となれば成功です。
もし必要な設定が欠けていたりして作成に失敗した場合はFAILEDとなり、ロールバックされます。エラーの詳細はEventsを見るとわかりますので、エラー内容に応じてテンプレートを修正し、再適用してください。

③S3バケットが作成されたことの確認
AWSコンソールでS3のページを見ると、テンプレートで指定したバケットが作成されています。

CloudFormationテンプレートを作るコツ

上ではとてもシンプルなテンプレートを紹介しましたが、各サービスごとにCloudFormationでできる設定も様々で、どうテンプレートを組めばいいのか最初は悩むと思います。そこで、テンプレートを作るコツをいくつか紹介します。

①AWS公式ドキュメントを見る
CloudFormationの公式ドキュメントはかなり充実していて、どのサービスで何の設定ができるかが全て書いてあります。「cloudformation サービス名」のようにググればだいたい公式ドキュメントがトップに出てくるので、細かい設定の仕方や意味を読みながらテンプレートを作っていくと理解も深まっていいと思います。
例:S3バケットのドキュメント
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html

②ハードコーディングは避ける
プログラミングのコツのような内容ですが、実は上記でS3バケットを作成したテンプレートはあまりよろしくなく、バケット名を直接記載するような書き方は避けた方が無難です。

BucketName: "s3-cf-test-meat9"

実運用では複数のテンプレートファイルで複数のStackを管理することが多くなり、名前をハードコーディングすると複数のStackで同じ名前を使ってエラーになってしまった、みたいなことが起こりやすくなります。
ハードコーディングする代わりとして、
・各サービスの名称にはStack名を利用する
・環境名など動的に変更したい値はパラメータで指定する
といったやり方がおすすめです。
※Nameの指定は必須でないことが多く、指定しない場合はCloudFormationが勝手に名前をつけてくれます。そのやり方なら名前被りの心配はないのですが、コンソールから一覧を見たときに「どのS3バケットがどのStackのやつだっけ?」とわかりづらくなってしまいがちなので、個人的にはStack名をprefixにしてNameを指定するのが運用しやすくていいと思います。

③組み込み関数を利用する
テンプレートを作っていく中で、別のリソースの情報を使いたい、文字列の結合をしたい、といったケースは多々あると思いますが、その際にCloudFormationの組み込み関数が便利です。個人的によく使うのは!Ref、!Join、!Subあたりで、組み込み関数を使いこなせればCloudFormationがより便利になるので、ぜひ活用してみてください。
・!Ref:別のリソースの情報を参照したい場合に使用する
・!Join:複数文字列を結合したい場合に使用する
・!Sub:変数で動的に文字列を変えたい場合に使用する

①〜③を踏まえてS3バケット作成のテンプレートを改善すると、以下のようになります。一例として、参考にしてください。

Parameters:
  Environment:
    Type: String
    Default: prod

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Join ['-', [!Ref AWS::StackName, !Ref Environment]]

終わりに

IaCを初めてやる人は慣れるまでちょっと大変かもしれないですが、慣れると逆にGUIで設定するのが煩わしいとなるくらいに便利なものです。AWSを最大限に活用するには必須と言っても過言ではないくらいなので、ぜひ積極的にIaCを実践してインフラ管理を楽にしていきましょう!

この記事が気に入ったらサポートをしてみませんか?