2024年09月11日
CloudFormationを使用する際のポイント
今回のブログではAWS CloudFormationを取り上げます。
例えば、社内のシステム管理を行う方で、業務部門からクラウド環境の払い出しを依頼されて、環境を構築する場合を考えてみましょう。何度も依頼を受ける中で、その際の作業時間を短縮したい、構築ミスを減らしたい、作業を誰でもできるようにしたいという考えることはありませんか。
このような場合に使用いただきたいサービスがAWS CloudFormationです。AWS CloudFormationは、インフラストラクチャをテンプレートと呼ばれるものでコード化することで、環境構築を自動化できます。テンプレートを使用することで誰が実行してもミスなく環境構築ができ、作業時間の短縮も実現できます。今回は便利なCloudFormationのテンプレートを作成する際のポイントをご紹介します。
作成の度に変更される可能性があるものはパラメータ化する
例えばEC2を作成する場合を考えてみましょう。セキュリティグループやIAMロールは同じでも、用途に応じてインスタンスタイプを変更する必要があるという場合に、インスタンスタイプをテンプレートにハードコーディングしているとしましょう。
すると、こちらのテンプレートは固定のインスタンスタイプにしか対応できないものとなってしまい、テンプレートとしての機能を十分に生かしきれません。このようなことにならないために、テンプレートを実行する際に変更する可能性があるものはパラメータセクションに定義し、実行する際にユーザが指定できるようにします。こうすることで実行する度に必要な箇所を変更しつつ、リソース作成が可能な汎用的なテンプレートとなります。
パラメータはテキストボックスとして定義することはもちろんのこと、デフォルト値を設定することや、リストから選択させることが可能ですので、入力値にあった形で設定することでユーザに優しいテンプレートを作成することができます。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html
適切な単位で作成する
対象リソース数多くある場合に全て1つにまとめたテンプレートを作成すると、可読性が低下することや修正があった場合に全体に影響する可能性があること等、テンプレートのメンテナンス性が著しく落ちます。
どのリソース単位でテンプレート作成するのかということも考慮することで、修正があった際に必要最低限のリソースを変更することができ、関係ないリソースに影響を及ぼすことがなくなります。
一般的な分割例としては以下のようなものがあります。
①リソースのライフサイクル毎
②処理に必要なサービスのまとまり毎
③リソースの所有者毎
④リージョン毎
テンプレートはリージョン毎に実行する必要があるため、複数リージョンを対応とする場合は「④リージョン毎」は必須となることにご注意ください。"
依存関係を考慮する
実際にリソースを作成する際には複数のリソースを組み合わせることになります。作成するものによっては依存関係を持っていることがあるため、リソースが作成される順番を考慮してテンプレートを作成する必要があります。例えば、先ほどと同様にEC2を作成する場合を考えた時にEC2にIAMロールをアタッチさせるためには、EC2の作成よりもIAMロールが作成されている必要があります。テンプレートを実行する際は、テンプレート内に記述された順番でリソースが必ずしも作成されるわけではありません。AWS CloudFormationでは依存関係を定義するものが用意されており、例として2つ挙げます。
1つ目は「Ref」や「Fn::GetAtt」のような組み込み関数で、こちらを使用することでテンプレート内の値を指定することができ、暗黙的に依存関係を定義することができます。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html
2つ目はDependsOn 属性で、組み込み関数を使用しない場合に使用することにより明示的に依存関係を定義することができます。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html
また、あるテンプレート内で作成したリソースのIDなどの値を別のテンプレートに渡したい場合には、提供元のテンプレート内でOutputsオプションのExportで定義し、提供先のテンプレート内でFn::ImportValueの組み込み関数を使用することで値の受け渡しが可能になります。こちらは複数リージョンをまたいで行うことはできないということにご注意ください。
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
まとめ
汎用的なテンプレートを作成する際のポイントをご紹介させていただきました。対象とするリソースが少ない場合や構成が単純な場合はテンプレート作成は容易に行うことができますが、リソースが多い場合や構成が複雑な場合はテンプレート自体が複雑になるため作成が困難になることがあります。
また、要件に合うリソースの構成を検討する必要もあります。JSOLはこのような場合にもリソースの構成検討から効果的なテンプレート作成まで支援することが可能です。こういった課題をお持ちの場合は、ぜひJSOLにお気軽にお問い合わせください。