見出し画像

AWS IaC EC2

AWS Infrastructure as Code (IaC)

従来の手動によるインフラストラクチャの設定や管理をコードで自動化する手法のこと。これにより、インフラストラクチャの構築、デプロイ、管理が効率的かつ一貫性を持って行えるようになる。
また、コードは再利用可能であり、モジュール化することで様々なプロジェクトや環境に適用可能であり、一度作成したテンプレートやスクリプトは、他のプロジェクトでも簡単に利用できる。
インフラの拡張や縮小がコードを変更するだけで行えるため、スケーラブルなアーキテクチャを簡単に実現。


IaCツール

  • AWS CloudFormation:

    • JSONまたはYAMLで記述されたテンプレートを使って、AWSリソースのプロビジョニングを自動化。

    • スタックという単位でリソースを管理し、依存関係も自動で解決。

  • AWS CDK (Cloud Development Kit):

    • プログラミング言語(Python、JavaScript、TypeScript、Java、C#など)を使ってインフラストラクチャを記述。

    • 高レベルの抽象化を提供し、開発者が使いやすい。

  • Terraform:

    • HashiCorpが開発したオープンソースのIaCツール。

    • AWSだけでなく、他のクラウドプロバイダもサポートし、柔軟なインフラ管理が可能。


CloudFormationでのEC2作成例

標準的なEC2の作成テンプレート

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Provision EC2",
  "Parameters": {
    "KeyName": {
      "Description": "The EC2 Key Pair to allow SSH access to the instance",
      "Type": "AWS::EC2::KeyPair::KeyName"
    },
    "SubnetId": {
      "Description": "The subnet ID where the instance will be deployed",
      "Type": "AWS::EC2::Subnet::Id"
    },
    "SecurityGroupId": {
      "Description": "ID of an existing Security Group",
      "Type": "AWS::EC2::SecurityGroup::Id",
      "AllowedPattern": "sg-[a-zA-Z0-9]+",
      "ConstraintDescription": "Must be a valid security group ID."
    },
    "InstanceType": {
      "Description": "EC2 instance type",
      "Type": "String",
      "Default": "t2.micro",
      "AllowedValues": [
        "t1.micro",
        "t2.nano",
        "t2.micro",
        "t2.small",
        "t2.medium",
        "t2.large",
        "m1.small",
        "m1.medium",
        "m1.large",
        "m1.xlarge",
        "m2.xlarge",
        "m2.2xlarge",
        "m2.4xlarge",
        "m3.medium",
        "m3.large",
        "m3.xlarge",
        "m3.2xlarge",
        "m4.large",
        "m4.xlarge",
        "m4.2xlarge",
        "m4.4xlarge",
        "m4.10xlarge",
        "c1.medium",
        "c1.xlarge",
        "c3.large",
        "c3.xlarge",
        "c3.2xlarge",
        "c3.4xlarge",
        "c3.8xlarge",
        "c4.large",
        "c4.xlarge",
        "c4.2xlarge",
        "c4.4xlarge",
        "c4.8xlarge",
        "g2.2xlarge",
        "g2.8xlarge",
        "r3.large",
        "r3.xlarge",
        "r3.2xlarge",
        "r3.4xlarge",
        "r3.8xlarge",
        "i2.xlarge",
        "i2.2xlarge",
        "i2.4xlarge",
        "i2.8xlarge",
        "d2.xlarge",
        "d2.2xlarge",
        "d2.4xlarge",
        "d2.8xlarge",
        "hi1.4xlarge",
        "hs1.8xlarge",
        "cr1.8xlarge",
        "cc2.8xlarge",
        "cg1.4xlarge"
      ],
      "ConstraintDescription": "Must be a valid EC2 instance type."
    },
    "VolumeSize": {
      "Description": "Size of the EBS volume in GiB",
      "Type": "Number",
      "Default": 10,
      "MinValue": 1,
      "MaxValue": 30
    },
    "VolumeType": {
      "Description": "Type of the EBS volume",
      "Type": "String",
      "Default": "gp2",
      "AllowedValues": [
        "gp2",
        "io1",
        "sc1",
        "st1",
        "standard"
      ]
    }
  },
  "Mappings": {
    "AWSInstanceType2Arch": {
      "c1.medium": {
        "Arch": "HVM64"
      },
      "c1.xlarge": {
        "Arch": "HVM64"
      },
      "c3.2xlarge": {
        "Arch": "HVM64"
      },
      "c3.4xlarge": {
        "Arch": "HVM64"
      },
      "c3.8xlarge": {
        "Arch": "HVM64"
      },
      "c3.large": {
        "Arch": "HVM64"
      },
      "c3.xlarge": {
        "Arch": "HVM64"
      },
      "c4.2xlarge": {
        "Arch": "HVM64"
      },
      "c4.4xlarge": {
        "Arch": "HVM64"
      },
      "c4.8xlarge": {
        "Arch": "HVM64"
      },
      "c4.large": {
        "Arch": "HVM64"
      },
      "c4.xlarge": {
        "Arch": "HVM64"
      },
      "cc2.8xlarge": {
        "Arch": "HVM64"
      },
      "cr1.8xlarge": {
        "Arch": "HVM64"
      },
      "d2.2xlarge": {
        "Arch": "HVM64"
      },
      "d2.4xlarge": {
        "Arch": "HVM64"
      },
      "d2.8xlarge": {
        "Arch": "HVM64"
      },
      "d2.xlarge": {
        "Arch": "HVM64"
      },
      "g2.2xlarge": {
        "Arch": "HVMG2"
      },
      "g2.8xlarge": {
        "Arch": "HVMG2"
      },
      "hi1.4xlarge": {
        "Arch": "HVM64"
      },
      "hs1.8xlarge": {
        "Arch": "HVM64"
      },
      "i2.2xlarge": {
        "Arch": "HVM64"
      },
      "i2.4xlarge": {
        "Arch": "HVM64"
      },
      "i2.8xlarge": {
        "Arch": "HVM64"
      },
      "i2.xlarge": {
        "Arch": "HVM64"
      },
      "m1.large": {
        "Arch": "HVM64"
      },
      "m1.medium": {
        "Arch": "HVM64"
      },
      "m1.small": {
        "Arch": "HVM64"
      },
      "m1.xlarge": {
        "Arch": "HVM64"
      },
      "m2.2xlarge": {
        "Arch": "HVM64"
      },
      "m2.4xlarge": {
        "Arch": "HVM64"
      },
      "m2.xlarge": {
        "Arch": "HVM64"
      },
      "m3.2xlarge": {
        "Arch": "HVM64"
      },
      "m3.large": {
        "Arch": "HVM64"
      },
      "m3.medium": {
        "Arch": "HVM64"
      },
      "m3.xlarge": {
        "Arch": "HVM64"
      },
      "m4.10xlarge": {
        "Arch": "HVM64"
      },
      "m4.2xlarge": {
        "Arch": "HVM64"
      },
      "m4.4xlarge": {
        "Arch": "HVM64"
      },
      "m4.large": {
        "Arch": "HVM64"
      },
      "m4.xlarge": {
        "Arch": "HVM64"
      },
      "r3.2xlarge": {
        "Arch": "HVM64"
      },
      "r3.4xlarge": {
        "Arch": "HVM64"
      },
      "r3.8xlarge": {
        "Arch": "HVM64"
      },
      "r3.large": {
        "Arch": "HVM64"
      },
      "r3.xlarge": {
        "Arch": "HVM64"
      },
      "t1.micro": {
        "Arch": "HVM64"
      },
      "t2.large": {
        "Arch": "HVM64"
      },
      "t2.medium": {
        "Arch": "HVM64"
      },
      "t2.micro": {
        "Arch": "HVM64"
      },
      "t2.nano": {
        "Arch": "HVM64"
      },
      "t2.small": {
        "Arch": "HVM64"
      }
    },
    "AWSInstanceType2NATArch": {
      "c1.medium": {
        "Arch": "NATHVM64"
      },
      "c1.xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.2xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.4xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.8xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.large": {
        "Arch": "NATHVM64"
      },
      "c3.xlarge": {
        "Arch": "NATHVM64"
      },
      "c4.2xlarge": {
        "Arch": "NATHVM64"
      },
      "c4.4xlarge": {
        "Arch": "NATHVM64"
      },
      "c4.8xlarge": {
        "Arch": "NATHVM64"
      },
      "c4.large": {
        "Arch": "NATHVM64"
      },
      "c4.xlarge": {
        "Arch": "NATHVM64"
      },
      "cc2.8xlarge": {
        "Arch": "NATHVM64"
      },
      "cr1.8xlarge": {
        "Arch": "NATHVM64"
      },
      "d2.2xlarge": {
        "Arch": "NATHVM64"
      },
      "d2.4xlarge": {
        "Arch": "NATHVM64"
      },
      "d2.8xlarge": {
        "Arch": "NATHVM64"
      },
      "d2.xlarge": {
        "Arch": "NATHVM64"
      },
      "g2.2xlarge": {
        "Arch": "NATHVMG2"
      },
      "g2.8xlarge": {
        "Arch": "NATHVMG2"
      },
      "hi1.4xlarge": {
        "Arch": "NATHVM64"
      },
      "hs1.8xlarge": {
        "Arch": "NATHVM64"
      },
      "i2.2xlarge": {
        "Arch": "NATHVM64"
      },
      "i2.4xlarge": {
        "Arch": "NATHVM64"
      },
      "i2.8xlarge": {
        "Arch": "NATHVM64"
      },
      "i2.xlarge": {
        "Arch": "NATHVM64"
      },
      "m1.large": {
        "Arch": "NATHVM64"
      },
      "m1.medium": {
        "Arch": "NATHVM64"
      },
      "m1.small": {
        "Arch": "NATHVM64"
      },
      "m1.xlarge": {
        "Arch": "NATHVM64"
      },
      "m2.2xlarge": {
        "Arch": "NATHVM64"
      },
      "m2.4xlarge": {
        "Arch": "NATHVM64"
      },
      "m2.xlarge": {
        "Arch": "NATHVM64"
      },
      "m3.2xlarge": {
        "Arch": "NATHVM64"
      },
      "m3.large": {
        "Arch": "NATHVM64"
      },
      "m3.medium": {
        "Arch": "NATHVM64"
      },
      "m3.xlarge": {
        "Arch": "NATHVM64"
      },
      "m4.10xlarge": {
        "Arch": "NATHVM64"
      },
      "m4.2xlarge": {
        "Arch": "NATHVM64"
      },
      "m4.4xlarge": {
        "Arch": "NATHVM64"
      },
      "m4.large": {
        "Arch": "NATHVM64"
      },
      "m4.xlarge": {
        "Arch": "NATHVM64"
      },
      "r3.2xlarge": {
        "Arch": "NATHVM64"
      },
      "r3.4xlarge": {
        "Arch": "NATHVM64"
      },
      "r3.8xlarge": {
        "Arch": "NATHVM64"
      },
      "r3.large": {
        "Arch": "NATHVM64"
      },
      "r3.xlarge": {
        "Arch": "NATHVM64"
      },
      "t1.micro": {
        "Arch": "NATHVM64"
      },
      "t2.large": {
        "Arch": "NATHVM64"
      },
      "t2.medium": {
        "Arch": "NATHVM64"
      },
      "t2.micro": {
        "Arch": "NATHVM64"
      },
      "t2.nano": {
        "Arch": "NATHVM64"
      },
      "t2.small": {
        "Arch": "NATHVM64"
      }
    },
    "AWSRegionArch2AMI": {
      "af-south-1": {
        "HVM64": "ami-0412806bd0f2cf75f",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-east-1": {
        "HVM64": "ami-0e0a21f8bd5195698",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-northeast-1": {
        "HVM64": "ami-0c3e3e7af817ad732",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-northeast-2": {
        "HVM64": "ami-0f8dbbf156e3a5cc6",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-northeast-3": {
        "HVM64": "ami-02a371c41f08cc499",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-south-1": {
        "HVM64": "ami-0f4ab3c8db917e421",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-south-2": {
        "HVM64": "ami-008b9c53bb1dcd29c",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-southeast-1": {
        "HVM64": "ami-0c3189395e5b39df7",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-southeast-2": {
        "HVM64": "ami-040d698318c0b1575",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-southeast-3": {
        "HVM64": "ami-065dcca47dde26602",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ap-southeast-4": {
        "HVM64": "ami-043e25432cf94e107",
        "HVMG2": "NOT_SUPPORTED"
      },
      "il-central-1": {
        "HVM64": "ami-0054be7d7d9d65a1d",
        "HVMG2": "NOT_SUPPORTED"
      },
      "ca-central-1": {
        "HVM64": "ami-05f40104305a2cdf7",
        "HVMG2": "NOT_SUPPORTED"
      },
      "cn-north-1": {
        "HVM64": "ami-03f1e08d409b1e5fd",
        "HVMG2": "NOT_SUPPORTED"
      },
      "cn-northwest-1": {
        "HVM64": "ami-00093746b9a0e272a",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-central-1": {
        "HVM64": "ami-0f454ec961da9a046",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-north-1": {
        "HVM64": "ami-0e78cd18c67fcf512",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-south-1": {
        "HVM64": "ami-07d048788725b9602",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-west-1": {
        "HVM64": "ami-0db5ca3e5748fb7e2",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-west-2": {
        "HVM64": "ami-07baf6b15b7387f24",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-west-3": {
        "HVM64": "ami-05a13fbd8aa57eedc",
        "HVMG2": "NOT_SUPPORTED"
      },
      "me-south-1": {
        "HVM64": "ami-0007de3fdcaba7e44",
        "HVMG2": "NOT_SUPPORTED"
      },
      "me-central-1": {
        "HVM64": "ami-06ce88defa3fc74ed",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-south-2": {
        "HVM64": "ami-051306f4e885d6de4",
        "HVMG2": "NOT_SUPPORTED"
      },
      "eu-central-2": {
        "HVM64": "ami-0fcd532574732cb0f",
        "HVMG2": "NOT_SUPPORTED"
      },
      "sa-east-1": {
        "HVM64": "ami-07f6e9fce0e888425",
        "HVMG2": "NOT_SUPPORTED"
      },
      "us-east-1": {
        "HVM64": "ami-01989ebfd388ea377",
        "HVMG2": "NOT_SUPPORTED"
      },
      "us-east-2": {
        "HVM64": "ami-0de69dde1945155da",
        "HVMG2": "NOT_SUPPORTED"
      },
      "us-west-1": {
        "HVM64": "ami-08fe20a82dcaa1c92",
        "HVMG2": "NOT_SUPPORTED"
      },
      "us-west-2": {
        "HVM64": "ami-05848d23360f5edfe",
        "HVMG2": "NOT_SUPPORTED"
      }
    }
  },
  "Resources": {
    "EC2": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "ImageId": {
          "Fn::FindInMap": [
            "AWSRegionArch2AMI",
            {
              "Ref": "AWS::Region"
            },
            {
              "Fn::FindInMap": [
                "AWSInstanceType2Arch",
                {
                  "Ref": "InstanceType"
                },
                "Arch"
              ]
            }
          ]
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "KeyName": {
          "Ref": "KeyName"
        },
        "SubnetId": {
          "Ref": "SubnetId"
        },
        "SecurityGroupIds": [
          {
            "Ref": "SecurityGroupId"
          }
        ],
        "BlockDeviceMappings": [
          {
            "DeviceName": "/dev/sda1",
            "Ebs": {
              "VolumeSize": {
                "Ref": "VolumeSize"
              },
              "VolumeType": {
                "Ref": "VolumeType"
              },
              "DeleteOnTermination": true
            }
          }
        ]
      }
    }
  }
}


コードの説明

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Provision EC2",
}

解説:

  • `AWSTemplateFormatVersion`はテンプレートのフォーマットバージョンを指定するもので、この場合は`2010-09-09`が指定されている。

  • `Description`はテンプレートの概要を説明しており、ここではEC2インスタンスの設定内容について述べている。


Parameters セクション

CloudFormationテンプレートに動的な入力を提供するために使用する。ユーザーがテンプレートを実行する際に、特定の値を指定できるようにする。

  • Description: パラメータの説明。

  • Type: パラメータのデータ型(例: String, Number)。

  • Default: パラメータのデフォルト値。

  • AllowedPattern, MinLength, MaxLength, MinValue, MaxValueなど: パラメータの入力制約。

{
  "Parameters": {
    "KeyName": {
      "Description": "The EC2 Key Pair to allow SSH access to the instance",
      "Type": "AWS::EC2::KeyPair::KeyName"
    },
    "SubnetId": {
      "Description": "The subnet ID where the instance will be deployed",
      "Type": "AWS::EC2::Subnet::Id"
    },
    "SecurityGroupId": {
      "Description": "ID of an existing Security Group",
      "Type": "AWS::EC2::SecurityGroup::Id",
      "AllowedPattern": "sg-[a-zA-Z0-9]+",
      "ConstraintDescription": "Must be a valid security group ID."
    },
    "InstanceType": {
      "Description": "EC2 instance type",
      "Type": "String",
      "Default": "t2.micro",
      "AllowedValues": [
        "t1.micro",
        "t2.nano",
        "t2.micro",
        "t2.small",
        "t2.medium",
        "t2.large",
        "m1.small",
        "m1.medium",
        "m1.large",
        "m1.xlarge",
        "m2.xlarge",
        "m2.2xlarge",
        "m2.4xlarge",
        "m3.medium",
        "m3.large",
        "m3.xlarge",
        "m3.2xlarge",
        "m4.large",
        "m4.xlarge",
        "m4.2xlarge",
        "m4.4xlarge",
        "m4.10xlarge",
        "c1.medium",
        "c1.xlarge",
        "c3.large",
        "c3.xlarge",
        "c3.2xlarge",
        "c3.4xlarge",
        "c3.8xlarge",
        "c4.large",
        "c4.xlarge",
        "c4.2xlarge",
        "c4.4xlarge",
        "c4.8xlarge",
        "g2.2xlarge",
        "g2.8xlarge",
        "r3.large",
        "r3.xlarge",
        "r3.2xlarge",
        "r3.4xlarge",
        "r3.8xlarge",
        "i2.xlarge",
        "i2.2xlarge",
        "i2.4xlarge",
        "i2.8xlarge",
        "d2.xlarge",
        "d2.2xlarge",
        "d2.4xlarge",
        "d2.8xlarge",
        "hi1.4xlarge",
        "hs1.8xlarge",
        "cr1.8xlarge",
        "cc2.8xlarge",
        "cg1.4xlarge"
      ],
      "ConstraintDescription": "Must be a valid EC2 instance type."
    },
    "VolumeSize": {
      "Description": "Size of the EBS volume in GiB",
      "Type": "Number",
      "Default": 10,
      "MinValue": 1,
      "MaxValue": 30
    },
    "VolumeType": {
      "Description": "Type of the EBS volume",
      "Type": "String",
      "Default": "gp2",
      "AllowedValues": [
        "gp2",
        "io1",
        "sc1",
        "st1",
        "standard"
      ]
    }
  }
}

解説:

  • `Parameters`セクションでは、テンプレートに渡されるパラメータを定義している。

  • `SecurityGroupId`は既存のセキュリティグループのIDを受け取るためのパラメータ。AllowedPatternでフォーマットを制限。

  • `SubnetId`はインスタンスをデプロイするサブネットのIDを受け取るパラメータ。

  • `KeyName`はEC2接続時に使用するキーペア。

  • `EbsVolumeSize`はEBSボリュームのサイズ(GB)を受け取るパラメータ。デフォルトは10GB、最小1GB、最大30GB。

Mappings

{
  "Mappings": {
    "AWSInstanceType2Arch": {
      "c1.medium": {
        "Arch": "HVM64"
      },
      "c1.xlarge": {
        "Arch": "HVM64"
      },
      "c3.2xlarge": {
        "Arch": "HVM64"
      },
      // さらに多くのインスタンスタイプ
    },
    "AWSInstanceType2NATArch": {
      "c1.medium": {
        "Arch": "NATHVM64"
      },
      "c1.xlarge": {
        "Arch": "NATHVM64"
      },
      "c3.2xlarge": {
        "Arch": "NATHVM64"
      },
      // さらに多くのインスタンスタイプ
    },
    "AWSRegionArch2AMI": {
      "us-east-1": {
        "HVM64": "ami-01989ebfd388ea377",
        "HVMG2": "NOT_SUPPORTED"
      },
      "us-west-1": {
        "HVM64": "ami-08fe20a82dcaa1c92",
        "HVMG2": "NOT_SUPPORTED"
      },
      // さらに多くのリージョン
    }
  }
}

インスタンスタイプとアーキテクチャ、リージョンとAMIのマッピング情報。これにより、インスタンスの適切なAMIを選択するための情報が提供される。


Resources セクション

AWSリソースを定義する。ここで定義されたリソースがCloudFormationによって作成、設定、管理される。

 {
  "Resources": {
    "EC2": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "ImageId": {
          "Fn::FindInMap": [
            "AWSRegionArch2AMI",
            {
              "Ref": "AWS::Region"
            },
            {
              "Fn::FindInMap": [
                "AWSInstanceType2Arch",
                {
                  "Ref": "InstanceType"
                },
                "Arch"
              ]
            }
          ]
        },
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "KeyName": {
          "Ref": "KeyName"
        },
        "SubnetId": {
          "Ref": "SubnetId"
        },
        "SecurityGroupIds": [
          {
            "Ref": "SecurityGroupId"
          }
        ],
        "BlockDeviceMappings": [
          {
            "DeviceName": "/dev/sda1",
            "Ebs": {
              "VolumeSize": {
                "Ref": "VolumeSize"
              },
              "VolumeType": {
                "Ref": "VolumeType"
              },
              "DeleteOnTermination": true
            }
          }
        ]
      }
    }
  }
}

解説:
`Resources`セクションでは、AWSリソースを定義している。

  • InstanceType: InstanceType パラメータを参照

  • KeyName: KeyName パラメータを参照

  • ImageId: ImageId パラメータを参照

  • SubnetId: SubnetId パラメータを参照

  • SecurityGroupIds: SecurityGroupId パラメータを参照

  • BlockDeviceMappings: EBS ボリュームの設定を含む


Parametersセクションで定義されたパラメータは、Resourcesセクションでリソースのプロパティとして参照される。
これにより、テンプレートの実行時にユーザーが指定した値を使ってリソースを動的に設定できる。

このテンプレートを使うことで、指定されたパラメータを基に、セキュリティグループ、サブネット、KMSキーなどの設定が行われたEC2インスタンスが自動で作成される。


補足

"Ref"
指定されたリソースやパラメータの値を参照することができる。

"Ref": "SubnetId"

Fn::Sub
文字列の置換を行うために使用され、リソースの名前やパラメータの値などを動的に埋め込むことができる。

{
  "Resources": {
    "MyEC2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": "t2.nano",
        "KeyName": { "Ref": "KeyName" },
        "ImageId": "ami-064d2a8f528240c59",
        "SubnetId": { "Ref": "SubnetId" },
        "PrivateIpAddress": { "Ref": "PrivateIpAddress" },
        "SecurityGroupIds": [
          { "Ref": "SecurityGroupId" }
        ],
        "BlockDeviceMappings": [
          {
            "DeviceName": "/dev/xvda",
            "Ebs": {
              "VolumeSize": { "Ref": "EbsVolumeSize" },
              "VolumeType": "gp2",
              "Encrypted": true
            }
          }
        ],
        "UserData": {
          "Fn::Base64": {
            "Fn::Sub": [
              "#!/bin/bash\n" +
              "yum update -y\n" +
              "yum install -y httpd\n" +
              "systemctl start httpd\n" +
              "systemctl enable httpd\n" +
              "echo \"<html><h1>Hello from your EC2 instance!</h1></html>\" > /var/www/html/index.html\n" +
              "useradd ${NewUserName}\n" +
              "echo ${NewUserName}:${NewUserPassword} | chpasswd",
              {
                "NewUserName": { "Ref": "NewUserName" },
                "NewUserPassword": { "Ref": "NewUserPassword" }
              }
            ]
          }
        }
      }
    }
  }
}

テンプレートのパラメータ NewUserName と NewUserPassword を動的に挿入している。


AWS CloudFormationでの操作



CLIでのEC2作成例

# EC2インスタンスの作成
aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --count 1 \
    --instance-type t2.micro \
    --key-name MyKeyPair \
    --security-group-ids sg-0123456789abcdef0 \
    --subnet-id subnet-6e7f829e \
    --private-ip-address 10.0.0.10 \
    --iam-instance-profile Name=MyIAMRole \
    --user-data file://my_script.sh \
    --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=MyInstance}]' \
    --block-device-mappings '[{"DeviceName":"/dev/sdh","Ebs":{"VolumeSize":20,"VolumeType":"gp2","DeleteOnTermination":true}}]'

# 削除保護の有効化
aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --disable-api-termination

各オプションの説明

  • --image-id: 使用するAmazonマシンイメージ(AMI)のID。

  • --count: 作成するインスタンスの数。

  • --instance-type: インスタンスタイプ。

  • --key-name: インスタンスにSSHでアクセスするためのキーペアの名前。

  • --security-group-ids: インスタンスが所属するセキュリティグループのID。

  • --subnet-id: インスタンスを配置するサブネットのID。

  • --private-ip-address: インスタンスに割り当てるプライベートIPアドレス。

  • --iam-instance-profile: インスタンスにアタッチするIAMロールの名前。

  • --user-data: インスタンス起動時に実行するスクリプトのファイルパス。

  • --tag-specifications: リソースにタグを追加する設定。

  • --block-device-mappings: インスタンスにアタッチするブロックデバイス(EBSボリューム)の設定。

  • --disable-api-termination: 削除保護の有効化。






よろしければサポートお願いします!よりいい情報を発信します。