トピック

【IaC】AWS Cloudformationの使い方を丁寧に解説!

2023/11/28に公開

2023/12/17

AWS
【IaC】AWS Cloudformationの使い方を丁寧に解説!

はじめに

皆さん。AWS Cloudformationはご存知ですか??最近流行りのIaCです。AWS認定資格でも良く出てきたりするものの、個人開発ではあまり使う機会が無いと思います。本記事では、そんなCloudformationを実務で常に使用している私の考えも踏まえながら、図を用いて丁寧に解説していきます!

本記事では以下の構成で進めていきます。本記事が読み終わる頃にはCloudformationが綺麗に理解できていることと思います。

  • IaC/AWS Cloudformationの概要
  • AWS Cloudformationの使い方
  • Cloudformationのメリット
  • Cloudformationのデメリット
  • Cloudformationはどんな場面で使える?

IaC/AWS Cloudformationの概要

IaCとは、Infrastructure as Codeの略です。コードを書いてインフラ構築することをIaCと呼びます。CloudformationはIaCの中に分類されます。後ほどお伝えしますが、インフラをコードで管理することで様々なメリットがあります。

例) AWS Cloudformation, Terraform

その中でAWS Cloudformationとは、コードを書く事でAWSサービスを自動で作成してくれるサービスです!AWSサービス専門のIaCになります。

AWS Cloudformationの使い方

ここからはCloudformationの実際の使い方に関して、以下の流れでお伝えしていきます。

  1. 用語(テンプレートなど)を理解する
  2. AWSリソースの理解を深める
  3. どのようにスタックを分けるか決める
  4. 公式ドキュメントを見ながらテンプレートを記述する
  5. スタックをデプロイする

①用語(テンプレートなど)を理解する

Cloudformationで利用される以下の単語をまずは理解しましょう。

  • テンプレート
    • AWSリソースをどう構築するかといった構築内容を定義するファイルのことです。各リソースの依存関係もこのテンプレートに記述されます。例えばLambdaのIAMロールにSNSFullAccessを付けるなどです。記述方法としては、jsonとyamlの2種類の形式で記述可能です。
  • プロビジョニング
    • 必要に応じてサーバなどの各リソースを利用できるように準備する事です。テンプレートを使って構築内容を事前に定義すること、はプロビジョニングと言えます。そのため、Cloudformationでは、テンプレートをプロビジョニングして利用していきます。
  • スタック
    • テンプレートでプロビジョニングされるAWSリソースが集合したものです。例えば、IAMポリシーのみを記述したものをスタックAと定義したり、LambdaのIAMロールにSNSFullAccessを付けることを記述したものをスタックBと定義することができます。スタックを削除した場合、スタック内の全てのリソースは削除されます。既存のテンプレートから更新した際、差分のあるリソースのみに対して変更を加えることが可能です。

②AWSリソースの理解を深める

次に行うことはAWSリソースの理解を深めることです。これが非常に重要です。

Cloudformationと言っても、結局はAWSマネジメントコンソールから手作業で構築する設定内容をコードで書いているものです。つまり、構築したいリソースそのものの理解が足りていないと、コードを記述する際にどのように設定すれば良いかわかりません。そのため、マネジメントコンソールで手作業で構築する際の設定と比較して、コードに起こしていくやり方を取る場合もあります。

③どのようにスタックを分けるか決める

次にどのようにスタックを分けるかを決めます。以下の図で示します。

スタックAは、IAMポリシーのみを定義しています。一方でスタックBはIAMポリシーを定義し、IAMロールに紐づけ、それをLambdaにアタッチするまでを定義しています。

スタックは、全く同じ環境を再度作りたい時に、スタックをデプロイするとすぐに構築されます。つまり、細かくリソースを分けて記述するのか、またある程度複数のリソースをまとめて定義しておくのかといったスタック戦略を定める必要があります。

④公式ドキュメントを見ながらテンプレートを記述する

スタック戦略が定まったところで、実際にテンプレートを記述していきます。そのために「cloudformation 構築したいリソース名」で検索すると上位でAWS Documentationのサイトがヒットすると思います。jsonやyamlそれぞれの記述方法が載っていますので、これを確認します。

その後、ご自身の好きなテキストエディタなどで記述していきます。テンプレートの記述方法やスタックの設定は別記事でお伝えしますので、お待ちください。

※私はCloudformationは普段yamlで書いています。Cloudformationに限らず、CI/CDのデプロイメントやk8sのserviceなど、yamlを使う場面の方が多いためです。

cloudformation 構築したいリソース名
cloudformation 構築したいリソース名
Type: AWS::EC2::Instance
Properties:
  AdditionalInfo: String
  Affinity: String
  AvailabilityZone: String
  BlockDeviceMappings: 
    - BlockDeviceMapping
  CpuOptions: 
    CpuOptions
  CreditSpecification: 
    CreditSpecification
  DisableApiTermination: Boolean
  EbsOptimized: Boolean
  ElasticGpuSpecifications: 
    - ElasticGpuSpecification
  ElasticInferenceAccelerators: 
    - ElasticInferenceAccelerator
  EnclaveOptions: 
    EnclaveOptions
  HibernationOptions: 
    HibernationOptions
  HostId: String
  HostResourceGroupArn: String
  IamInstanceProfile: String
  ImageId: String
  InstanceInitiatedShutdownBehavior: String
  InstanceType: String
  Ipv6AddressCount: Integer
  Ipv6Addresses: 
    - InstanceIpv6Address
  KernelId: String
  KeyName: String
  LaunchTemplate: 
    LaunchTemplateSpecification
  LicenseSpecifications: 
    - LicenseSpecification
  Monitoring: Boolean
  NetworkInterfaces: 
    - NetworkInterface
  PlacementGroupName: String
  PrivateDnsNameOptions: 
    PrivateDnsNameOptions
  PrivateIpAddress: String
  PropagateTagsToVolumeOnCreation: Boolean
  RamdiskId: String
  SecurityGroupIds: 
    - String
  SecurityGroups: 
    - String
  SourceDestCheck: Boolean
  SsmAssociations: 
    - SsmAssociation
  SubnetId: String
  Tags: 
    - Tag
  Tenancy: String
  UserData: String
  Volumes: 
    - Volume

⑤スタックをデプロイする

テンプレートを記述し、スタックをデプロイして作成完了です。スタックをデプロイすると、各リソースが順に構築されていきます。

Cloudformationのメリット

ここからはCloudformationのメリットをお伝えしていきます。

  1. 2度目以降に同じアーキを構築する際に、全く同じ構成を担保して素早く構築できる
    1. Cloudformationはコードでインフラ構成が記述されているため、スタックをデプロイすれば、同じ構成を担保して(冪等性を持つ)デプロイできます。そのため、スタックの分け方を工夫することで、2度目以降の構築の際に、開発コストを削減でき、また品質を担保できます。これはCloudformationやIaCの最も大きなメリットと言えます。
  2. インフラの管理が簡単になる
    1. コードで構成を管理できるため、管理が非常に簡単になります。テンプレートを確認するだけで、どのような設定を行っているかを確認できます。もしマネジメントコンソールからの設定を行っている場合であれば、その設定内容を別途管理する必要があります。
  3. 自動構築してくれる
    1. テンプレートに構築したいリソースの設定を記述することで、順にリソースをデプロイしてくれます。リソースによっては、デプロイする際に時間が掛かるものもあり、それをデプロイしてからでないと次のリソースをデプロイできない!といったようなことが起こりえます。ただ、Cloudformationであれば順に実行されるので、放置していて問題ないのです。

Cloudformationのデメリット

ここからはCloudformationのデメリットをお伝えしていきます。

  1. 学習コストが高い
    1. Cloudformationは独自の書き方でコード化します。そのため、マネジメントコンソールからデプロイすることと比較すると、コードの書き方を覚える必要があります。そのため上記のメリットを十分に受けられない場合は、マネジメントコンソールからのデプロイが適しています。
  2. AWSサービス以外に流用できない
    1. CloudformationはAWSのサービスです。そのため、他のGCP等別ベンダーのサービスを記述することはできません。
  3. ドキュメントが読みにくい
    1. AWSのドキュメントを見ながらコードを記述するのですが、どの項目が必須なのかなど、記述方法を探すのに時間が掛かる印象です。
  4. スタックの分け方に関して最適解を見つけることが難しい
    1. これは今私が現状抱えている問題です。どこまで1つのスタックでリソースを記述するかの線引きが難しいです。スタックにまとめなさすぎると、メリットが享受できないですし、一方でまとめすぎると、流用しにくくなります。構築する環境や、その環境をどう運用したいか、など各プロジェクトの運用の方向性に左右される部分が大きく、これは非常に難しい問題になっています。

Cloudformationはどんな場面で使える?

上記を踏まえるとこんな場合にCloudformationはオススメできます。

  • 大規模なインフラを構築したい時
    • 大規模になるとインフラの管理が煩雑になります。コード化することで他者との共有が簡単になります。
  • 同じ環境を複数作りたい時
    • メリットでも挙げましたが、2度目以降の構築の際に非常に構築が楽になります。よくあるパターンであると、開発環境・ステージング環境・本番環境の3環境を作る際に、共通している箇所はCloudformationで素早くデプロイでき、かつ設定内容も担保できます。

まとめ

いかがでしたか?CloudformationなどのIaCは近年企業に導入されてきている技術です。個人開発でメリットを享受できることは少ないかもしれません。ただインフラエンジニアとしてキャリアを築く際には、必ず関わる技術であると思います。学習として捉えて、現在の構成をIaCで再構築してみるのも面白いかもしれません。

tearnではCloudformationを用いたコンテンツも随時アップロードしていきますので、是非チェックしてみてください!最後までお読みいただきありがとうございました。

トップへ戻る

目次