AWS Cloudformationを使ってVPCやEC2を作成してみます。
私はAWSをなるべく無料枠で使用したいので無料枠の有効期限(1年)が切れる度にアカウントを新規作成しています。
その際、新規作成したアカウントにVPCやサブネット等をイチから作成するのは面倒なので予めコード化したリソースをCloudformationで実行し作成することにしてます。
Cloudformationテンプレート
Cloudformationのテンプレート(実行ファイル)として「YAML」と「JSON」の2パターンありますが、今回は「YAML」を使用していきます。
テンプレート作成のためのマニュアルはこちらを参照します。
まずはVPC等のネットワークリソースを作成し、その後EC2インスタンスを作成します。
YAML
VPC作成のYAML
VPC等のネットワークリソース作成用のyamlを下記のとおり定義。
テンプレートの書き方についてはこちらを参照。
AWSTemplateFormatVersion: "2010-09-09" Description: Create VPC Subnet ###------------------------------------------------------------# ### Parameters ###------------------------------------------------------------# Parameters: #### VPCアドレス VPCCIDR: Type: String Default: "192.168.0.0/16" #### パブリックサブネット(メイン) PublicSubnetMainCIDR: Type: String Default: "192.168.1.0/24" #### パブリックサブネット(サブ) PublicSubnetSubCIDR: Type: String Default: "192.168.11.0/24" #### プライベートサブネット(メイン) PrivateSubnetMainCIDR: Type: String Default: "192.168.2.0/24" #### プライベートサブネット(サブ) PrivateSubnetSubCIDR: Type: String Default: "192.168.21.0/24" ###------------------------------------------------------------# ### Resources ###------------------------------------------------------------# Resources: #### VPC VPC: Type: 'AWS::EC2::VPC' Properties: # VPCアドレス CidrBlock: !Ref VPCCIDR # DNS解決 EnableDnsSupport: "true" # DNSホスト名 EnableDnsHostnames: "true" # タグ Tags: - Key: Name Value: !Sub "vpc-main" #### サブネット # パブリックサブネット(メイン) PublicSubnetMain: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref VPC CidrBlock: !Ref PublicSubnetMainCIDR AvailabilityZone: "ap-northeast-1c" Tags: - Key: Name Value: "public-subnet-1" # パブリックサブネット(サブ) PublicSubnetSub: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref VPC CidrBlock: !Ref PublicSubnetSubCIDR AvailabilityZone: "ap-northeast-1d" Tags: - Key: Name Value: "public-subnet-2" # プライベートサブネット(メイン) PrivateSubnetMain: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref VPC CidrBlock: !Ref PrivateSubnetMainCIDR AvailabilityZone: "ap-northeast-1c" Tags: - Key: Name Value: "private-subnet-1" # プライベートサブネット(サブ) PrivateSubnetSub: Type: 'AWS::EC2::Subnet' Properties: VpcId: !Ref VPC CidrBlock: !Ref PrivateSubnetSubCIDR AvailabilityZone: "ap-northeast-1d" Tags: - Key: Name Value: "private-subnet-2" #### インターネットゲートウェイ InternetGateway: Type: 'AWS::EC2::InternetGateway' Properties: Tags: - Key: Name Value: "igw-main" AttachInternetGateway: Type: 'AWS::EC2::VPCGatewayAttachment' Properties: VpcId: !Ref VPC InternetGatewayId: !Ref InternetGateway #### ルートテーブル # パブリックサブネット用ルートテーブル PublicRouteTable: Type: "AWS::EC2::RouteTable" Properties: VpcId: !Ref VPC Tags: - Key: Name Value: "public-routetable" # プライベートサブネット用ルートテーブル PrivateRouteTable: Type: "AWS::EC2::RouteTable" Properties: VpcId: !Ref VPC Tags: - Key: Name Value: "private-routetable" #### ルーティング # インターネットゲートウェイ(パブリックさサブネット用) PublicRoute: Type: 'AWS::EC2::Route' Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: "0.0.0.0/0" GatewayId: !Ref InternetGateway # パブリックサブネット(メイン)用 PublicSubnetMainRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PublicSubnetMain RouteTableId: !Ref PublicRouteTable # パブリックサブネット(サブ)用 PublicSubnetSubRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PublicSubnetSub RouteTableId: !Ref PublicRouteTable # プライベートサブネット(メイン)用 PrivateSubnetMainRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PrivateSubnetMain RouteTableId: !Ref PrivateRouteTable # プライベートサブネット(サブ)用 PrivateSunetSubRouteTableAssociation: Type: 'AWS::EC2::SubnetRouteTableAssociation' Properties: SubnetId: !Ref PrivateSubnetSub RouteTableId: !Ref PrivateRouteTable # ------------------------------------------------------------# # Outputs # ------------------------------------------------------------# Outputs: #### VPC VPC: Value: !Ref VPC Export: Name: "vpc-id" VPCCIDR: Value: !Ref VPCCIDR Export: Name: "vpc-cidr" #### Subnet PublicSubnetMain: Value: !Ref PublicSubnetMain Export: Name: "public-subnet-mai-id" PublicSubnetMainCIDR: Value: !Ref PublicSubnetMainCIDR Export: Name: !Sub "public-subnet-main-cidr" PublicSubnetSub: Value: !Ref PublicSubnetSub Export: Name: !Sub "public-subnet-sub-id" PublicSubnetSubCIDR: Value: !Ref PublicSubnetSubCIDR Export: Name: !Sub "public-subnet-sub-cidr" PrivateSubnetMain: Value: !Ref PrivateSubnetMain Export: Name: !Sub "private-subnet-main-id" PrivateSubnetMainCIDR: Value: !Ref PrivateSubnetMainCIDR Export: Name: !Sub "private-subnet-main-cidr" PrivateSubnetSub: Value: !Ref PrivateSubnetSub Export: Name: !Sub "private-subnet-sub-id" PrivateSubnetSubCIDR: Value: !Ref PrivateSubnetSubCIDR Export: Name: !Sub "private-subnet-sub-cidr" #### Route PublicRouteTable: Value: !Ref PublicRouteTable Export: Name: !Sub "public-routetable" PrivateRouteTable: Value: !Ref PrivateRouteTable Export: Name: !Sub "private-routetable" #### Internetgateway InternetGateway: Value: !Ref InternetGateway Export: Name: !Sub "internetgateway"
EC2インスタンス作成のYAML
EC2を作成するyamlは下記のとおり。
“LaunchTemplate”を使用している理由としては、「TagSpecifications」によるrootボリュームやネットワークインタフェースにタグ名を付けるためと、「MetadataOptions」によるインスタンスメタデータの指定をするためです。
※「AWS::EC2::Instance」の中で上記を指定することができないためです。
AWSTemplateFormatVersion: "2010-09-09" Description: Create EC2 from AMI ###------------------------------------------------------------# ### Parameters ###------------------------------------------------------------# Parameters: #### インスタンスタイプ InstanceType: Type: String Default: t3.micro AllowedValues: - t2.micro - t3.micro ConstraintDescription: error #### AMI ImageId: Default: ami-0c83761315c7e07ec Type: String #### サブネット Subnet: Default: subnet-00847f3a2f659e433 Type: String AllowedValues: - subnet-00847f3a2f659e433 - subnet-0c4166124fadd89e7 #### IPアドレス PrivateIpv4: Default: 192.168.1.10 Type: String #### セキュリティーグループ SecurityGroup: Default: sg-04e4de147ba991996 Type: String #### スナップショット Snapshot01: Description: DataVolume Default: snap-08be5fadd51c424b5 Type: String #### キーペア keypair: Default: keypair-3361 Type: String #### IAMロール iamrole: Default: CloudWatchAccess Type: String #### 詳細モニタリング Monitoring: Default: false Type: String AllowedValues: - true - false #### 削除保護 DeleteTermination: Default: false Type: String AllowedValues: - true - false ###------------------------------------------------------------# ### Resources ###------------------------------------------------------------# Resources: #### EC2インスタンス EC2Instance: Type: AWS::EC2::Instance Properties: # AMI ImageId: !Ref ImageId # インスタンスタイプ InstanceType: !Ref InstanceType # ネットワークインタフェース NetworkInterfaces: - DeviceIndex: 0 # 説明 Description: test-NIC # パブリックIPアドレス AssociatePublicIpAddress: false # プライベートIPアドレス PrivateIpAddress: !Ref PrivateIpv4 # セキュリティーグループ GroupSet: - !Ref SecurityGroup # サブネット SubnetId: !Ref Subnet # IAMロール IamInstanceProfile: !Ref iamrole # キーペア KeyName: !Ref keypair # 詳細モニタリング Monitoring: !Ref Monitoring # 削除保護 DisableApiTermination: !Ref DeleteTermination # ボリューム BlockDeviceMappings: - DeviceName: /dev/sda1 Ebs: VolumeType: gp2 - DeviceName: /dev/sdb Ebs: SnapshotId: !Ref Snapshot01 VolumeType: gp2 # タグ Tags: - Key: 'Name' Value: 'test-ec2' # テンプレート LaunchTemplate: LaunchTemplateId: !Ref LaunchTemplate Version: 1 #### テンプレート ####Volumeやネットワークインターフェースへのタグ付与、メタデータのバージョン指定にはLaunchTemplateから指定する必要あり LaunchTemplate: Type: AWS::EC2::LaunchTemplate Properties: # テンプレート名 LaunchTemplateName: test-ec2-template # テンプレート内の値 LaunchTemplateData: # タグ TagSpecifications: # rootボリューム - ResourceType: volume Tags: - Key: Name Value: ebs-test-ec2-root # ネットワークインタフェース - ResourceType: network-interface Tags: - Key: Name Value: eni-test-ec2-eth0 # メタデータ(V2を設定するにはrequiredを指定) MetadataOptions: HttpTokens: required ###------------------------------------------------------------# ### Output Parameters ###------------------------------------------------------------# Outputs: EC2: Value: !Ref EC2Instance Export: Name: "test-ec2"
Cloudformation実行
VPC作成のスタック実行
まずはCloudformationでVPCを作成していきます。

vpc作成用のyamlファイルをアップロード。

スタックの名前と各パラメータを設定(パタメータはデフォルト値をそのまま使用)

あとはそのまま「次へ」で進めていってスタックを送信。

ステータスがCREATE_COMPLETEになれば作成完了。
VPCやサブネット、ルーティングされてます。
EC2作成のスタック実行
同様にEC2のスタックも実行。
値はテンプレートのデフォルト値を使用。

テンプレートの値どおりの設定でEC2が作成されます。

テンプレートも作成されてます。

作成したリソースの削除
Cloudformationで作成したVPCやEC2はスタックを削除することにより全て削除されます。

EC2が終了済みになる。

以上で完了。
コメント