AWSに戻る

AWS CloudFormation

AWS CloudFormationとは

AWS CloudFormationは、AWSリソースをコードとして定義し、プロビジョニングするためのインフラストラクチャ as コード(IaC)サービスです。CloudFormationを使用すると、テンプレートファイルを作成してAWSリソースとそれらの依存関係を記述し、それらのリソースを「スタック」として一緒にデプロイおよび管理できます。これにより、インフラストラクチャのプロビジョニングと管理を自動化し、一貫性のある再現可能な方法でAWS環境を構築することができます。

AWS CloudFormationの主な特徴

CloudFormationの仕組み

CloudFormationの基本的な仕組みは以下の通りです:

  1. テンプレートの作成: JSONまたはYAML形式でAWSリソースとその設定を定義します。
  2. テンプレートの保存: テンプレートをローカルまたはS3バケットに保存します。
  3. スタックの作成: テンプレートを使用してCloudFormationスタックを作成します。
  4. リソースのプロビジョニング: CloudFormationはテンプレートに基づいてAWSリソースを自動的にプロビジョニングします。
  5. スタックの管理: スタックを更新、削除、またはその状態を監視します。

CloudFormationのワークフロー

テンプレート作成 → テンプレート検証 → スタック作成/更新 → リソースプロビジョニング → スタック完了
                                      ↓
                                  [エラー発生] → 自動ロールバック
        

CloudFormationテンプレートの構造

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

セクション 必須 説明
AWSTemplateFormatVersion いいえ テンプレートのバージョン(通常は "2010-09-09")
Description いいえ テンプレートの説明
Metadata いいえ テンプレートに関する追加情報
Parameters いいえ スタック作成時に渡すことができる値
Rules いいえ スタック作成または更新時に適用されるパラメータの検証ルール
Mappings いいえ キーと値のマッピング(例:リージョンごとのAMI ID)
Conditions いいえ リソースの作成や設定を条件付きで行うための条件
Transform いいえ AWS SAMなどのマクロを適用するための指定
Resources はい 作成または更新するAWSリソースとその設定
Outputs いいえ スタックの作成後に参照できる値

CloudFormationテンプレートの例

基本的なEC2インスタンスを作成するYAMLテンプレート

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Simple EC2 instance template'

Parameters:
  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t2.medium
    ConstraintDescription: must be a valid EC2 instance type.

  KeyName:
    Description: Name of an existing EC2 KeyPair
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.

Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      ImageId: ami-0c55b159cbfafe1f0  # Amazon Linux 2 AMI in us-east-1
      SecurityGroups:
        - !Ref InstanceSecurityGroup
      Tags:
        - Key: Name
          Value: MyInstance

  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0

Outputs:
  InstanceId:
    Description: The Instance ID
    Value: !Ref MyEC2Instance

  PublicIP:
    Description: Public IP address of the EC2 instance
    Value: !GetAtt MyEC2Instance.PublicIp

  PublicDNS:
    Description: Public DNS of the EC2 instance
    Value: !GetAtt MyEC2Instance.PublicDnsName

VPCとサブネットを作成するYAMLテンプレート

AWSTemplateFormatVersion: '2010-09-09'
Description: 'VPC with public and private subnets'

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

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref MyVPC
      CidrBlock: 10.0.2.0/24
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      Tags:
        - Key: Name
          Value: Private Subnet 1

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: MyIGW

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref MyVPC
      InternetGatewayId: !Ref InternetGateway

  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref MyVPC
      Tags:
        - Key: Name
          Value: Public Route Table

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet1
      RouteTableId: !Ref PublicRouteTable

Outputs:
  VpcId:
    Description: The VPC ID
    Value: !Ref MyVPC

  PublicSubnetId:
    Description: The public subnet ID
    Value: !Ref PublicSubnet1

  PrivateSubnetId:
    Description: The private subnet ID
    Value: !Ref PrivateSubnet1

CloudFormationの使用方法

CloudFormationは、AWS Management Console、AWS CLI、SDKs、またはインフラストラクチャ as コード(IaC)ツールを使用して利用できます。

スタックの作成

AWS CLIを使用したスタックの作成

aws cloudformation create-stack \
    --stack-name my-network-stack \
    --template-body file://network.yaml \
    --parameters ParameterKey=KeyName,ParameterValue=my-key

パラメータファイルを使用したスタックの作成

aws cloudformation create-stack \
    --stack-name my-network-stack \
    --template-body file://network.yaml \
    --parameters file://parameters.json

parameters.jsonの例:

[
  {
    "ParameterKey": "KeyName",
    "ParameterValue": "my-key"
  },
  {
    "ParameterKey": "InstanceType",
    "ParameterValue": "t2.micro"
  }
]

スタックの管理

スタックの一覧表示

aws cloudformation list-stacks

スタックの詳細取得

aws cloudformation describe-stacks --stack-name my-network-stack

スタックの更新

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

変更セットの作成と実行

# 変更セットの作成
aws cloudformation create-change-set \
    --stack-name my-network-stack \
    --change-set-name my-change-set \
    --template-body file://updated-network.yaml

# 変更セットの詳細表示
aws cloudformation describe-change-set \
    --stack-name my-network-stack \
    --change-set-name my-change-set

# 変更セットの実行
aws cloudformation execute-change-set \
    --stack-name my-network-stack \
    --change-set-name my-change-set

スタックの削除

aws cloudformation delete-stack --stack-name my-network-stack

CloudFormationのベストプラクティス

CloudFormationの制限事項

CloudFormationとAWS CDKの比較

AWS Cloud Development Kit(CDK)は、プログラミング言語を使用してCloudFormationテンプレートを生成するためのフレームワークです。

特徴 CloudFormation AWS CDK
定義方法 YAML/JSON(宣言的) TypeScript、Python、Java、C#など(命令的)
抽象化レベル 低(リソースレベル) 高(コンストラクトレベル)
再利用性 ネスト化されたスタック、カスタムリソース クラス、モジュール、ライブラリ
型安全性 なし あり(言語による)
ロジックの実装 制限あり プログラミング言語の機能を活用可能
学習曲線 比較的緩やか プログラミング知識が必要
最終的な出力 CloudFormationテンプレート CloudFormationテンプレート

CloudFormationとTerraformの比較

TerraformはHashiCorpが提供するオープンソースのインフラストラクチャ as コードツールで、AWSだけでなく複数のクラウドプロバイダーをサポートしています。

特徴 CloudFormation Terraform
プロバイダー AWSのみ マルチクラウド(AWS、Azure、GCP、その他)
言語 YAML/JSON HCL(HashiCorp Configuration Language)
状態管理 AWSが管理 状態ファイルを管理する必要あり
変更検出 ドリフト検出 計画フェーズ(terraform plan)
リソースのサポート AWSリソースの包括的なサポート 多くのプロバイダーのリソースをサポート
モジュール化 ネスト化されたスタック Terraformモジュール
コミュニティ AWSコミュニティ 幅広いオープンソースコミュニティ
統合 AWSサービスとの緊密な統合 多くのサードパーティツールとの統合

まとめ

AWS CloudFormationは、AWSリソースをコードとして定義し、プロビジョニングするための強力なインフラストラクチャ as コードサービスです。テンプレートを使用してAWSリソースとその依存関係を記述し、それらのリソースをスタックとして一緒にデプロイおよび管理することで、インフラストラクチャのプロビジョニングと管理を自動化できます。

CloudFormationの主な利点は以下の通りです:

CloudFormationを効果的に活用するには、テンプレートのバージョン管理、パラメータの適切な使用、変更セットの活用、ネスト化されたスタックの使用などのベストプラクティスを適用することが重要です。また、AWS CDKやTerraformなどの他のIaCツールと比較して、プロジェクトの要件に最も適したツールを選択することも重要です。