【AWS】CloudFormation で EC2 インスタンス構築のテンプレート集(いろいろな環境)

公開日時:2021年08月29日 / 最終更新日時:2021年08月31日

CloudFormation で EC2 インスタンス構築のテンプレートを解説します。

 

【AWS】CloudFormation の基本的な解説(VPCの作成手順)

 

【AWS】CloudFormation で Amazon EC2 インスタンスを作成する手順【単純な作成】【Part.1】

 

【AWS】CloudFormation で EC2 インスタンス(Amazon Linux2)を作成する手順【コマンドラインから実行】【Part.2】

 

一番シンプルな EC2 インスタンスのテンプレート

以下の一番シンプルなEC2インスタンス構築のテンプレートを発展させていきます。

 

■一番シンプルな EC2 インスタンスのテンプレート

AWSTemplateFormatVersion: "2010-09-09" 
Description: "Template EC2 Create" 
Resources: 
  MyEC2Instance:   # Amazon Linux2 の構築 
    Type: AWS::EC2::Instance 
    Properties: 
      ImageId: "ami-09ebacdc178ae23b7"      # Amazon Linux 2 AMI (HVM), SSD Volume Type 
      InstanceType: "t2.micro" 
      KeyName: "DevOps-test-EC2-key"    # 既存のキーペアを指定します。 
      BlockDeviceMappings: 
        - DeviceName: "/dev/sdm" 
          Ebs: 
            VolumeType: "io1" 
            Iops: "200" 
            DeleteOnTermination: "false" 
            VolumeSize: "20" 
        - DeviceName: "/dev/sdk" 
          NoDevice: {}

 

このテンプレートはデフォルトの VPC に自動的にIPアドレスを割り振られて構築されます。

しかしこれだけで簡単に EC2 インスタンスを構築できます。

 

 

 

■EC2 インスタンスのテンプレート

AWSTemplateFormatVersion: "2010-09-09" 
Description: "Template EC2 Create" 
Resources: 
  MyEC2Instance:   # Amazon Linux2 の構築 
    Type: AWS::EC2::Instance 
    Properties: 
      ImageId: "ami-09ebacdc178ae23b7"      # Amazon Linux 2 AMI (HVM), SSD Volume Type 
      InstanceType: "t2.micro" 
      AvailabilityZone: ap-northeast-1a     # アベイラビリティの指定 
      SubnetId:subnet-07bf3f32c417b33a3     # サブネットdevops-test-subnet-01のID 
      KeyName: "DevOps-test-EC2-key"        # 既存のキーペアの指定 
      BlockDeviceMappings: 
        - DeviceName: "/dev/sdm" 
          Ebs: 
            VolumeType: "gp2"               # 汎用SSD(gp2) 
            Iops: "100" 
            DeleteOnTermination: "false" 
            VolumeSize: "8"                 # ディスクサイズ8GB 
        - DeviceName: "/dev/sdk" 
          NoDevice: {} 
      Tags: 
        - Key: Name 
          Value: devops-test-ec01

 

 

 

ブロックデバイスマッピングの設定

ブロックデバイスマッピングの設定について調べました。

 

■ブロックデバイスマッピングの設定

AWSTemplateFormatVersion: "2010-09-09" 
Description: "Template EC2 Create" 
Resources: 
  MyEC2Instance:   # Amazon Linux2 の構築 
    Type: AWS::EC2::Instance 
    Properties: 
      ImageId: "ami-09ebacdc178ae23b7"      # Amazon Linux 2 AMI (HVM), SSD Volume Type 
      InstanceType: "t2.micro" 
      AvailabilityZone: ap-northeast-1a     # アベイラビリティの指定 
      SubnetId:subnet-07bf3f32c417b33a3     # サブネットdevops-test-subnet-01のID 
      KeyName: "DevOps-test-EC2-key"        # 既存のキーペアの指定 
      BlockDeviceMappings: ← ここからブロックデバイスマッピングの設定をしています。 
        - DeviceName: "/dev/sdm" 
          Ebs: 
            VolumeType: "gp2"               # 汎用SSD(gp2) 
            Iops: "100" 
            DeleteOnTermination: "false" 
            VolumeSize: "8"                 # ディスクサイズ8GB 
        - DeviceName: "/dev/sdk" 
          NoDevice: {} 
      Tags: 
        - Key: Name 
          Value: devops-test-ec01

 

AWS 公式サイトのテンプレートを参考にテンプレートを作ってますが、その中にデバイスマッピングの設定があります。

上のテンプレートでは2つのデバイスマッピングの設定をしていて、1つは DeviceName が /dev/sdm です。

もう1つは NoDevice になっています。

 

以下、ブロックデバイスマッピングについての詳細な解説です。

 

ブロックデバイスマッピング

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html

 

上の公式サイトの説明を調べると NoDevice の意味は「デバイスのマッピングを省略する」ということです。

ということは、下の設定の意味は /dev/sdk には何もデバイスをマッピングしませんということになります。

 ~ 省略 ~

 
        - DeviceName: "/dev/sdk" 
          NoDevice: {} 

 ~ 省略 ~

 

しかし、上の設定はある意味他のテンプレートを参考にしただけなので、この設定には意味がないというか不要ということになります。

今回は Amazon Linux2 の AMI を基に EC2 インスタンスを起動(構築)しましたが、これがもしカスタマイズした AMI で、且つ /dev/sdk デバイスに何かしらデータがあるが、今回構築する EC2 インスタンスには不要ということがはっきりしている場合には NoDevice の設定は意味があるかもしれませんが、今回に関しては何の意味もないことになります。

 

 

 

 

セキュリティグループを一緒に構築する EC2 インスタンスのテンプレート

EC2 インスタンス構築時に一緒にセキュリティグループも作成するテンプレートです。

 

■セキュリティグループを一緒に構築する EC2 インスタンスのテンプレート

AWSTemplateFormatVersion: "2010-09-09" 
Description: "Template EC2 Create" 
Resources: 
  DevOpsTestEC2SecurityGroup: 
    Type: AWS::EC2::SecurityGroup 
    Properties: 
      GroupDescription: "allow connections from specified CIDR ranges" 
      GroupName: devops-test-sg            # セキュリティグループ名
      VpcId: vpc-0f592cxxxxxxxxxx          # VPCを指定
      SecurityGroupIngress: 
      - IpProtocol: tcp 
        FromPort: 80 
        ToPort: 80 
        CidrIp: 0.0.0.0/0 
 
  MyEC2Instance:   # Amazon Linux2 の構築 
    Type: AWS::EC2::Instance 
    Properties: 
      ImageId: "ami-09ebacdc178ae23b7"      # Amazon Linux 2 AMI (HVM), SSD Volume Type 
      InstanceType: "t2.micro"              # インスタンスタイプを指定
      AvailabilityZone: ap-northeast-1a     # アベイラビリティの指定 
      SubnetId: subnet-07bf3f32c417b33a3    # サブネットdevops-test-subnet-01のID 
      SecurityGroupIds: 
        - !Ref DevOpsTestEC2SecurityGroup   # !Ref で DevOpsTestEC2SecurityGroup のセキュリティグループのIDを取得 
      KeyName: "DevOps-test-EC2-key"        # 既存のキーペアの指定 
      BlockDeviceMappings: 
        - DeviceName: "/dev/sdm" 
          Ebs: 
            VolumeType: "gp2"               # 汎用SSD(gp2) 
            DeleteOnTermination: "false" 
            VolumeSize: "8"                 # ディスクサイズ8GB 
        - DeviceName: "/dev/sdk" 
          NoDevice: {} 
 
      Tags: 
        - Key: Name 
          Value: devops-test-ec01           # Nameタグを設定

 

 

 

■複数のセキュリティグループを設定する場合

AWSTemplateFormatVersion: "2010-09-09" 
Description: "Template EC2 Create" 
Resources: 
  DevOpsTestEC2SecurityGroup: 
    Type: AWS::EC2::SecurityGroup 
    Properties: 
      GroupDescription: "allow connections from specified CIDR ranges" 
      GroupName: devops-test-sg 
      VpcId: vpc-0f592c5fb1d9e5e15 
      SecurityGroupIngress: 
      - IpProtocol: tcp 
        FromPort: 80 
        ToPort: 80 
        CidrIp: 0.0.0.0/0 
        Description: "Port 80 for Internet" 
      - IpProtocol: tcp           # 以下のように繰り返し記述して複数のルールを作成する
        FromPort: 443 
        ToPort: 443 
        CidrIp: 0.0.0.0/0 
        Description: "Port 443 for Internet" 
      - IpProtocol: tcp           # 以下のように繰り返し記述して複数のルールを作成する 
        FromPort: 22 
        ToPort: 22 
        CidrIp: 0.0.0.0/0 
        Description: "Port 22 for ssh login" 
 
  myENI: 
    Type: AWS::EC2::NetworkInterface 
    Properties: 
      Tags: 
      - Key: stack 
        Value: production 
      Description: A nice description. 
      SourceDestCheck: 'false' 
      GroupSet: 
      - !Ref DevOpsTestEC2SecurityGroup     # !Ref で DevOpsTestEC2SecurityGroup のセキュリティグループのIDを取得 
      SubnetId: subnet-07bf3f32c417b33a3    # サブネットdevops-test-subnet-01のID 
      PrivateIpAddress: 172.31.1.22         # プライベートIPアドレス 
 
  MyEC2Instance:   # Amazon Linux2 の構築 
    Type: AWS::EC2::Instance 
    Properties: 
      ImageId: "ami-09ebacdc178ae23b7"      # Amazon Linux 2 AMI (HVM), SSD Volume Type 
      InstanceType: "t2.micro" 
      AvailabilityZone: ap-northeast-1a     # アベイラビリティの指定 
      NetworkInterfaces: 
        - NetworkInterfaceId: 
            !Ref myENI 
          DeviceIndex: '0' 
      KeyName: "DevOps-test-EC2-key"        # 既存のキーペアの指定 
      BlockDeviceMappings: 
        - DeviceName: "/dev/sdm" 
          Ebs: 
            VolumeType: "gp2"               # 汎用SSD(gp2) 
            DeleteOnTermination: "false" 
            VolumeSize: "8"                 # ディスクサイズ8GB 
        - DeviceName: "/dev/sdk" 
          NoDevice: {} 
      Tags: 
        - Key: Name 
          Value: devops-test-ec01

 

 

EC2 インスタンスのプライベートIPアドレスを指定する

プライベートIPを指定して EC2 インスタンスを構築する場合ですが、せっかく AWS というクラウド環境を利用しているので、プライベートIPアドレスを利用しないような構成を考える方がよいと思います。

 

■プライベートIPを指定して EC2 インスタンスを構築する場合

AWSTemplateFormatVersion: "2010-09-09" 
Description: "Template EC2 Create" 
Resources: 
  DevOpsTestEC2SecurityGroup: 
    Type: AWS::EC2::SecurityGroup 
    Properties: 
      GroupDescription: "allow connections from specified CIDR ranges" 
      GroupName: devops-test-sg 
      VpcId: vpc-0f592c5fb1d9e5e15 
      SecurityGroupIngress: 
      - IpProtocol: tcp 
        FromPort: 80 
        ToPort: 80 
        CidrIp: 0.0.0.0/0 
        Description: "Port 80 for Internet" 
      - IpProtocol: tcp          
        FromPort: 443 
        ToPort: 443 
        CidrIp: 0.0.0.0/0 
        Description: "Port 443 for Internet" 
      - IpProtocol: tcp       
        FromPort: 22 
        ToPort: 22 
        CidrIp: 0.0.0.0/0 
        Description: "Port 22 for ssh login" 
 
  myENI: 
    Type: AWS::EC2::NetworkInterface 
    Properties: 
      Tags: 
      - Key: stack 
        Value: production 
      Description: A nice description. 
      SourceDestCheck: 'false' 
      GroupSet: 
      - !Ref DevOpsTestEC2SecurityGroup     # !Ref で DevOpsTestEC2SecurityGroup のセキュリティグループのIDを取得 
      SubnetId: subnet-07bf3f32c417b33a3    # サブネットdevops-test-subnet-01のID 
      PrivateIpAddress: 172.31.1.22         # プライベートIPアドレス 
 
  MyEC2Instance:   # Amazon Linux2 の構築 
    Type: AWS::EC2::Instance 
    Properties: 
      ImageId: "ami-09ebacdc178ae23b7"      # Amazon Linux 2 AMI (HVM), SSD Volume Type 
      InstanceType: "t2.micro" 
      AvailabilityZone: ap-northeast-1a     # アベイラビリティの指定 
      NetworkInterfaces: 
        - NetworkInterfaceId: 
            !Ref myENI 
          DeviceIndex: '0' 
      KeyName: "DevOps-test-EC2-key"        # 既存のキーペアの指定 
      BlockDeviceMappings: 
        - DeviceName: "/dev/sdm" 
          Ebs: 
            VolumeType: "gp2"               # 汎用SSD(gp2) 
            DeleteOnTermination: "false" 
            VolumeSize: "8"                 # ディスクサイズ8GB 
        - DeviceName: "/dev/sdk" 
          NoDevice: {} 
      Tags: 
        - Key: Name 
          Value: devops-test-ec01

 

 

 

Address is in subnet’s reserved address rangeでエラー

IPアドレス指定に予約アドレスを指定すると以下のエラーが出力されます。

Address is in subnet's reserved address range (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterValue; Request ID: ae0b3f86-0524-4a77-88f8-5aebd2e79149; Proxy: null)

【AWS】CloudFormation で EC2 インスタンス(Amazon Linux2)を作成する手順【コマンドラインから実行】【Part.2】

 

 

■予約 IP アドレス

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html

【AWS】CloudFormation で EC2 インスタンス(Amazon Linux2)を作成する手順【コマンドラインから実行】【Part.2】

 

 

 

 

 

 

Network interfaces and an instance-level subnet ID may not be specified on the same request でエラー

サブネットIDとセキュリティグループの場所を間違えると以下のエラーが出力されます。

Network interfaces and an instance-level subnet ID may not be specified on the same request (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterCombination; Request ID: 9089b9ff-14ea-4997-82de-75d8a4443a0e; Proxy: null)

 

【AWS】CloudFormation で EC2 インスタンス(Amazon Linux2)を作成する手順【コマンドラインから実行】【Part.2】

 

 

■原因

セキュリティグループとサブネットIDの指定は「Type: AWS::EC2::NetworkInterface」に記載します。
「Type: AWS::EC2::Instance」の方にに記載すると上のエラーが出力されます。

 

■正しい位置に記載した例

AWSTemplateFormatVersion: "2010-09-09" 
Description: "Template EC2 Create" 
Resources: 

 

  ~ 省略 ~

 myENI: 
    Type: AWS::EC2::NetworkInterface 
    Properties: 
      Tags: 
      - Key: stack 
        Value: production 
      Description: A nice description. 
      SourceDestCheck: 'false' 
      GroupSet: 
      - !Ref DevOpsTestEC2SecurityGroup     # セキュリティグループとサブネットIDの指定は 
      SubnetId: subnet-07bf3f32c417b33a3    # 「Type: AWS::EC2::NetworkInterface」に記載します。
      PrivateIpAddress: 172.31.1.22         # 「Type: AWS::EC2::Instance」に記載すると上のエラーが出力されます。
 
  MyEC2Instance:   # Amazon Linux2 の構築 
    Type: AWS::EC2::Instance 
    Properties: 
      ImageId: "ami-09ebacdc178ae23b7"      # Amazon Linux 2 AMI (HVM), SSD Volume Type 
      InstanceType: "t2.micro" 
      AvailabilityZone: ap-northeast-1a     # アベイラビリティの指定 
      NetworkInterfaces: 
        - NetworkInterfaceId: 
            !Ref myENI 
          DeviceIndex: '0' 
      KeyName: "DevOps-test-EC2-key"        # 既存のキーペアの指定 
      BlockDeviceMappings: 
        - DeviceName: "/dev/sdm" 
          Ebs: 
            VolumeType: "gp2"               # 汎用SSD(gp2) 
            DeleteOnTermination: "false" 
            VolumeSize: "8"                 # ディスクサイズ8GB 
        - DeviceName: "/dev/sdk" 
          NoDevice: {} 
      Tags: 
        - Key: Name 
          Value: devops-test-ec01

 

 

 

 

 

パブリックIPとプライベートIPアドレスを同時に設定するテンプレート

パブリックIPアドレス(Public IP Address)とプライベートIPアドレス(Private IP Address)を同時に設定するテンプレートです。

しかし今のところやりたいことができていません。

想定としては、1つのNICに対して指定したプライベートIPアドレスとパブリックIPアドレスが付与されることでしたが、想定通りにいかないので現在調査しています。

 

■パブリックIPとプライベートIPアドレスを同時に設定するテンプレートですがNICが2つできます

AWSTemplateFormatVersion: "2010-09-09" 
Description: "Template EC2 Create" 
Resources: 
  DevOpsTestEC2SecurityGroup: 
    Type: AWS::EC2::SecurityGroup 
    Properties: 
      GroupDescription: "allow connections from specified CIDR ranges" 
      GroupName: devops-test-sg 
      VpcId: vpc-0f592c5fb1d9e5e15 
      SecurityGroupIngress: 
      - IpProtocol: tcp 
        FromPort: 80 
        ToPort: 80 
        CidrIp: 0.0.0.0/0 
        Description: "Port 80 for Internet" 
      - IpProtocol: tcp 
        FromPort: 443 
        ToPort: 443 
        CidrIp: 0.0.0.0/0 
        Description: "Port 443 for Internet" 
      - IpProtocol: tcp 
        FromPort: 22 
        ToPort: 22 
        CidrIp: 0.0.0.0/0 
        Description: "Port 22 for ssh login" 
 
  PrivateIPAdressNic: 
    Type: AWS::EC2::NetworkInterface 
    Properties: 
      Description: "Private IP Address NIC" 
      #SourceDestCheck: 'false' 
      #GroupSet: 
      #- !Ref DevOpsTestEC2SecurityGroup     # !Ref で DevOpsTestEC2SecurityGroup のセキュリティグループのIDを取得 
      SubnetId: subnet-07bf3f32c417b33a3    # サブネットdevops-test-subnet-01のID 
      #PrivateIpAddress: 172.31.1.22         # プライベートIPアドレス 
    DependsOn: MyEC2Instance 
 
  NetworkInterfaceAttachment: 
    Type: AWS::EC2::NetworkInterfaceAttachment 
    Properties: 
      DeleteOnTermination: true 
      InstanceId: 
        Ref: MyEC2Instance 
      NetworkInterfaceId: 
        Ref: PrivateIPAdressNic 
      DeviceIndex: 1 
 
  MyEC2Instance:   # Amazon Linux2 の構築 
    Type: AWS::EC2::Instance 
    Properties: 
      ImageId: "ami-09ebacdc178ae23b7"      # Amazon Linux 2 AMI (HVM), SSD Volume Type 
      InstanceType: "t2.micro" 
      AvailabilityZone: ap-northeast-1a     # アベイラビリティの指定 
      NetworkInterfaces: 
        - AssociatePublicIpAddress: true 
          DeleteOnTermination: true 
          Description: "Public IP Address" 
          SubnetId: subnet-07bf3f32c417b33a3 
          DeviceIndex: '0' 
      KeyName: "DevOps-test-EC2-key"        # 既存のキーペアの指定 
      BlockDeviceMappings: 
        - DeviceName: "/dev/sdm" 
          Ebs: 
            VolumeType: "gp2"               # 汎用SSD(gp2) 
            DeleteOnTermination: "false" 
            VolumeSize: "8"                 # ディスクサイズ8GB 
        - DeviceName: "/dev/sdk" 
          NoDevice: {} 
 
      Tags: 
        - Key: Name 
          Value: devops-test-ec01

 

上記のテンプレートを確認すると EC2 インスタンス(AWS::EC2::Instance)に対してネットワークインタフェース(AWS::EC2::NetworkInterface)を割り当てて、更にネットワークインタフェース(AWS::EC2::NetworkInterface)に対してネットワークインタフェースアタッチメント(AWS::EC2::NetworkInterfaceAttachment)の設定をしています。

 

以下のような構成になっています。

AWS::EC2::NetworkInterfaceAttachment

↓ 割り当てる

AWS::EC2::NetworkInterface

↓ 割り当てる

AWS::EC2::Instance

 

上記テンプレートを実行すると EC2 インスタンスは下図のようなになります。

【AWS】CloudFormation で EC2 インスタンス(Amazon Linux2)を作成する手順【コマンドラインから実行】【Part.2】

 

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

AlphaOmega Captcha Medica  –  What Do You See?
     
 

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Secured By miniOrange