AWSのCloudFormation入門ガイド:インフラストラクチャをコードで管理する方法のヒーロー画像

AWSのCloudFormation入門ガイド:インフラストラクチャをコードで管理する方法


AWSのCloudFormation入門ガイド

AWS CloudFormationは、AWSリソースをコードとして定義し、そのコードをテンプレートとして使用してインフラストラクチャをプロビジョニングするサービスです。このガイドでは、CloudFormationの基本概念から実際の利用方法、そして運用のベストプラクティスまでを解説します。

CloudFormationとは何か

AWS CloudFormationは、Amazon Web Servicesが提供するInfrastructure as Code(IaC)サービスです。コードとしてインフラストラクチャを定義することで、一貫性のあるリソースの作成、更新、削除を行えます。

CloudFormationの主な特徴は以下の通りです:

  • インフラストラクチャのコード化: YAML/JSONテンプレートを使用してインフラをコードとして定義
  • 自動化されたデプロイ: 大規模なインフラストラクチャも一括でデプロイ可能
  • バージョン管理: テンプレートをソースコード管理システムに保存し、変更履歴を追跡
  • 依存関係の管理: リソース間の依存関係を自動的に解決
  • 変更の予測と検証: 変更をデプロイ前に確認できる「変更セット」機能
  • ロールバック機能: エラー発生時に自動的に以前の状態に戻す
  • クロスアカウント・クロスリージョンデプロイ: 複数のAWSアカウントやリージョンに展開
  • パラメータによるカスタマイズ: 環境ごとに異なる設定を適用

CloudFormationの重要性と採用広がる背景

近年、CloudFormationはシステム開発における重要な要素として認識されています。特に、以下のような背景から政府機関や大企業でも広く採用が進んでいます:

  1. ガバナンス強化:システム構成を明文化し、監査対応やコンプライアンス要件への適合が容易になる
  2. 標準化の推進:組織全体で一貫性のあるクラウド環境を構築・運用できる
  3. リスク軽減:手動操作によるミスを防止し、環境間の差異をなくす
  4. 計画的な変更管理:変更内容を事前に確認・承認することが可能
  5. ドキュメントとしての価値:テンプレート自体が最新のインフラ構成を示す正確なドキュメントとなる

多くの政府機関が調達仕様書においてIaC採用を明記するケースが増えており、CloudFormationはその要件を満たす代表的な選択肢となっています。

CloudFormationの基本概念

CloudFormationの理解に必要な基本概念を見ていきましょう。

テンプレート

CloudFormationのテンプレートは、JSONまたはYAML形式で記述され、以下のようなセクションで構成されます:

  • Resources: 作成するAWSリソースを定義する(必須)
  • Parameters: テンプレートに渡す入力値
  • Mappings: 条件に基づいて使用する値のマッピング
  • Conditions: リソース作成の条件
  • Outputs: スタック作成後に参照できる出力値
  • Metadata: テンプレートに関する追加情報
  • Transform: マクロやAWS SAMなどの変換を指定

スタック

スタックは、CloudFormationテンプレートをデプロイして作成されるAWSリソースの集合体です。スタックは一つの単位として管理され、作成・更新・削除が行われます。

変更セット

変更セットは、既存のスタックに対する変更をプレビューする機能です。実際に変更を適用する前に、どのリソースが追加、変更、削除されるかを確認できます。

CloudFormationの基本的な使い方

1. テンプレートの作成

簡単なEC2インスタンスを作成するYAML形式のテンプレート例:

AWSTemplateFormatVersion: '2010-09-09'
Description: 'シンプルなEC2インスタンスを作成するCloudFormationテンプレート'

Parameters:
  InstanceType:
    Description: EC2インスタンスタイプ
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t3.micro
    ConstraintDescription: インスタンスタイプはt2.micro、t2.small、またはt3.microから選択してください

Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      ImageId: ami-0c3fd0f5d33134a76  # Amazon Linux 2 AMI (東京リージョン)
      SecurityGroups:
        - !Ref InstanceSecurityGroup
      Tags:
        - Key: Name
          Value: CloudFormationテスト

  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EC2インスタンス用セキュリティグループ
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

Outputs:
  InstanceId:
    Description: 作成されたEC2インスタンスのID
    Value: !Ref MyEC2Instance
  PublicDNS:
    Description: EC2インスタンスのパブリックDNS
    Value: !GetAtt MyEC2Instance.PublicDnsName

2. スタックの作成

スタックを作成する方法は複数あります:

AWSマネジメントコンソールを使用

  1. CloudFormationコンソールにアクセス
  2. 「スタックの作成」をクリック
  3. テンプレートのアップロードまたはS3 URLを指定
  4. パラメータを入力
  5. オプション設定(タグ、IAMロール等)
  6. 確認と作成

AWS CLIを使用

aws cloudformation create-stack \
  --stack-name MyTestStack \
  --template-body file://template.yaml \
  --parameters ParameterKey=InstanceType,ParameterValue=t2.micro

3. スタックの更新

テンプレートを変更した後、既存のスタックを更新できます:

マネジメントコンソールを使用

  1. CloudFormationコンソールでスタックを選択
  2. 「更新」をクリック
  3. 新しいテンプレートをアップロード
  4. パラメータを確認・変更
  5. 変更セットをプレビュー
  6. 変更を適用

AWS CLIを使用

aws cloudformation update-stack \
  --stack-name MyTestStack \
  --template-body file://updated-template.yaml

CloudFormationの高度な機能と実践的活用法

ネストされたスタック

大規模なアーキテクチャをモジュール化するために、親スタックから子スタックを参照できます:

Resources:
  NetworkStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://s3.amazonaws.com/bucket/network.yaml

クロススタック参照

複数のスタック間でリソースを参照する場合、Exportを使用します:

# スタックA: 値をエクスポート
Outputs:
  VPCId:
    Value: !Ref MyVPC
    Export:
      Name: !Sub "${AWS::StackName}-VPCID"

# スタックB: エクスポートされた値を参照
Resources:
  MySubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !ImportValue MyStackA-VPCID

カスタムリソース

CloudFormationのネイティブサポートがないリソースや操作を扱うためのカスタムリソース:

Resources:
  MyCustomResource:
    Type: Custom::MyResource
    Properties:
      ServiceToken: !GetAtt MyLambdaFunction.Arn
      CustomProperty: SomeValue

StackSets

複数のAWSアカウントやリージョンにスタックをデプロイするためのStackSets:

aws cloudformation create-stack-set \
  --stack-set-name MultiRegionApp \
  --template-body file://global-app.yaml \
  --permission-model SELF_MANAGED

CloudFormationを使った実際のユースケース

ネットワーク環境の構築

VPC、サブネット、インターネットゲートウェイ、ルートテーブルなどのネットワークリソースをコードで定義:

Resources:
  MyVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: MyVPC

  PublicSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs ""]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: Public Subnet 1

  # その他のネットワークリソース...

マイクロサービスアーキテクチャの構築

ECS、API Gateway、Lambda、DynamoDBなどを組み合わせたマイクロサービスアーキテクチャ:

Resources:
  ApiGateway:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Name: MyServiceAPI

  LambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs14.x
      Code:
        S3Bucket: my-code-bucket
        S3Key: lambda-code.zip
      Role: !GetAtt LambdaExecutionRole.Arn

  # その他のマイクロサービスリソース...

CI/CDパイプラインの構築

CodePipeline、CodeBuild、CodeDeployを使ったCI/CDパイプライン:

Resources:
  CodePipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      RoleArn: !GetAtt CodePipelineServiceRole.Arn
      ArtifactStore:
        Type: S3
        Location: !Ref ArtifactBucket
      Stages:
        - Name: Source
          Actions:
            - Name: Source
              ActionTypeId:
                Category: Source
                Owner: AWS
                Provider: CodeStarSourceConnection
                Version: '1'
              Configuration:
                ConnectionArn: !Ref GitHubConnection
                FullRepositoryId: "user/repo"
                BranchName: main
              OutputArtifacts:
                - Name: SourceCode

        # ビルドステージとデプロイステージの定義...

CloudFormationの運用ベストプラクティス

テンプレート設計のベストプラクティス

  • モジュール化: 機能やリソースタイプ別にテンプレートを分割する
  • 再利用可能な設計: 汎用的なテンプレートを作成し、パラメータで柔軟性を持たせる
  • バージョン管理: テンプレートをGitなどのバージョン管理システムで管理する
  • コメントと説明: 目的や設定理由を明記し、メンテナンス性を高める

セキュリティのベストプラクティス

  • 最小権限の原則: 必要最小限のIAMパーミッションだけを付与
  • 機密データの管理: パラメータのNoEchoプロパティや、AWS Secrets Managerの活用
  • リソースのコンプライアンス確認: AWS Config Rulesを使用した継続的なコンプライアンス確認

コスト管理のベストプラクティス

  • コスト見積もり: AWS Pricing Calculatorを使用して、スタックのコストを事前に見積もる
  • タグ戦略: コスト配分タグを使用してリソースの費用を追跡
  • リソースの削除: 不要になったスタックは完全に削除し、コストを抑える

公共セクターにおけるCloudFormationの活用事例

近年、多くの政府機関や地方自治体がCloudFormationを含むIaCツールを採用しています。具体的な活用事例として:

  1. セキュリティ要件への準拠: 特定のセキュリティ要件(例:NIST SP 800-53)に準拠したテンプレートを標準化
  2. 災害対応システム: 災害時に短時間で復旧できるよう、インフラ構成を事前にコード化
  3. 行政サービスのモダナイゼーション: レガシーシステムをクラウドに移行する際のプロセス標準化

このようなケースでは、仕様書やRFP(提案依頼書)で明示的にIaCの採用を要件とするケースが増えており、CloudFormationの知識はクラウドエンジニアにとって必須のスキルとなりつつあります。

CloudFormationの代替手段と比較

CloudFormationと類似したIaCツールとの比較:

ツール特徴利点欠点
AWS CloudFormationAWSネイティブAWSサービスとの完全な統合、変更セット機能AWSリソースのみに限定
Terraformマルチクラウドクラウドプロバイダーに依存しない、シンプルな構文リソース状態の管理が必要
AWS CDKプログラマブル一般的なプログラミング言語を使用可能学習曲線がやや高い
Ansible手続き型エージェントレス、シンプルな記述宣言的でないため状態管理が複雑

まとめ

AWS CloudFormationは、インフラストラクチャをコードとして管理するための強力なツールです。テンプレートベースの宣言的アプローチにより、一貫性のあるリソース管理とデプロイの自動化を実現します。

政府機関や大企業でのIaCの普及により、CloudFormationの重要性はますます高まっています。システム要件や仕様書でIaCが標準として求められる中、CloudFormationのスキルを習得することは、クラウドエンジニアにとって大きな強みとなるでしょう。

本ガイドで紹介した基本的な概念と実践的なユースケースを参考に、CloudFormationを活用したインフラストラクチャ管理に取り組んでみてください。コードとしてインフラストラクチャを管理することで、より信頼性の高いクラウド環境の構築と運用が可能になります。