AWSCLIを使用してEC2を作成

[前回](https://qiita.com/tonkatsu_oishi/private/7693570c405344b8f602)はCLIを利用してVPC・サブネットを構築しました。

今回は、作成したVPC・サブネット上に踏み台サーバー2台・WEBサーバー2台を構築していこうと思います。

## 構成の確認
まずは前回構築した部分を確認します。
前回は、172.31.0.0/21の範囲のVPC上に、パブリックサブネット・プライベートサブネットを2台ずつ構築しました。
VPCにはInternetGatewayを紐づけ、パブリックサブネット上にはNatGatewayを構築しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/9353ceb0-1575-acfc-4d04-4124f41fcc38.png)

今回は、サブネットの上に踏み台サーバー（EC2）2台・WEBサーバー（EC2）2台を構築していきます。
踏み台サーバーには踏み台用の、WEBサーバーにはWEB用のセキュリティグループを紐づけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/574c52c9-026c-e9cc-e873-c6b7f7c7c5d2.png)

以前別記事にて、東京リージョン上に[EC2を構築](https://qiita.com/tonkatsu_oishi/items/9ffdd560624f25dc7fa9#%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%81%ABec2%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B)しました。東京リージョン状のEC2には、[別記事でご紹介した手順](https://qiita.com/tonkatsu_oishi/items/31aa7d2c17cac4b6ca84#ec2web12%E3%81%ABapache%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B)を行いApacheをインストールし、テストページを配置しています。
今回は、東京リージョン上のWEBサーバー取得したAMIを元に、大阪リージョン上にWEBサーバーを作成します。

※AWSマネジメントコンソール上でのEC2の構築手順は、以前に[別記事](https://qiita.com/tonkatsu_oishi/items/cded18d47108fb04961d#vpc%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E8%B8%8F%E3%81%BF%E5%8F%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E4%BD%9C%E6%88%90)にて一連の流れをご紹介しています。
また、AWSCLIの使用方法については[こちらの記事](https://qiita.com/tonkatsu_oishi/private/3b33c473f5f476e2bb62)にまとめているため、今回は実行したコマンドを中心に手順を確認していきます。

## 構築
### CloudShellの起動
### CloudShellの起動
AWSコンソールにログイン後、コンソール左下の「CloudShell」のリンクを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/316ce33b-1e5f-fe7d-fdc3-3096f9cb4eaa.png)

しばらく待機すると、CloudShellが立ち上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/6a8abe12-6000-bba2-b0d2-ec77b15edb27.png)

ここからコマンドを実行していきます。

### AMIの取得・コピー
#### 東京リージョン上のEC2からAMIを取得
##### 東京リージョン上で対象のEC2を検索する

**・基本の構文**
まずは、東京リージョン上でAMI取得対象のEC2を特定します。

    aws ec2 describe-instances
    
[参考:awscliコマンドリファレンス（create-vpc)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-instances.html)

**実行したコマンド**
今回は「HTTS_DEMO_02」というタグをつけたEC2のAMIを取得するため、フィルターでNameタグの指定を入れています。
また、後続の作業をやりやすくするために、返り値から「InstanceID」の値を取り出してEC2_ID_apne1という変数に格納しています。

    EC2_ID_apne1=$(aws --region ap-northeast-1 ec2 describe-instances --filters "Name=tag:Name,Values=HTTPS_DEMO_02" --query Reservations[].Instances[0].InstanceId --output text)

さらに、対象のEC2のNameタグを取得して、返り値を「AMI_NAME」という変数に格納します。

    AMI_NAME=$(aws ec2 describe-images --filters "Name=tag:Name,Values=HTTPS_DEMO_02" --query Images[0].Tags[?key=='Name'].Value --output text)
    
下記コマンドを実行し、「EC2_ID_apne1」の中身を確認します。

    echo $EC2_ID_apne1

下記コマンドを実行し、「AMI_NAME」を確認します。

    echo $AMI_NAME

##### AMIの取得
先程指定したEC2に対してAMIを取得します。
**基本の構文**

    aws ec2 create-image --instance-id <インスタンスID>

[参考:awscliコマンドリファレンス（create-image)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-image.html)

**実行したコマンド**
先程検索したEC2のIDを指定してAMIを取得します。
後続の作業をやりやすくするために、返り値のImageIDを「WEB_AMI_ID_apne1」という変数に格納します。

    WEB_AMI_ID_apne1=$(aws --region ap-northeast-1 ec2 create-image --instance-id $EC2_ID_apne1 --name $AMI_NAME --query ImageId --output text)


下記コマンドを実行し、「WEB_AMI_ID_apne1」を確認します。

    echo $WEB_AMI_ID_apne1

##### AMIが取得できたことを確認する
先程取得したAMIが利用可能となったことを確認します。

**基本の構文**

    aws ec2 describe-images --image-id <イメージID>
[参考:awscliコマンドリファレンス（describe-images)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-images.html)

**実行したコマンド**
今回はAMIIDを指定して、AMI名・AMIの状態を取得します。

    aws ec2 describe-images --region ap-northeast-1 --image-id $WEB_AMI_ID_apne1 --query 'Images[].{AMIName:Name,AMIState:State}' --output table

下記のような出力結果が帰ってきたら成功です。

    -----------------------------------
    |         DescribeImages          |
    +-------------------+-------------+
    |      AMIName      |  AMIState   |
    +-------------------+-------------+
    |  HTTPS_DEMO_02    |  available  |
    +-------------------+-------------+

##### 東京リージョン上のAMIを大阪リージョンへコピーする
取得したAMIを大阪リージョンへコピーします。
**基本の構文**

    ws ec2 copy-image --region <コピー先リージョン> --source-region <コピー元リージョン> --source-image-id <コピー元AMIのAMIID> --name <コピー先リージョンでのAMI名> --description <AMIの説明>

[参考:awscliコマンドリファレンス（copy-image)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/copy-image.html)

**実行したコマンド**
後続の作業をやりやすくするために、コマンドの返り値のImageIDを「WEB_AMI_ID_apne3」という変数に格納します。

    WEB_AMI_ID_apne3=$(aws ec2 copy-image --region ap-northeast-3 --source-region ap-northeast-1 --source-image-id $WEB_AMI_ID_apne1 --name $AMI_NAME --description $AMI_NAME --query ImageId --output text)

下記コマンドを実行し、「WEB_AMI_ID_apne3」を確認します。

    echo $WEB_AMI_ID_apne3

##### コピーしたAMIを確認する
作成したAMIが無事大阪リージョンへコピーされ、利用可能となっていることを確認します。

    aws ec2 describe-images --region ap-northeast-3 --image-id $WEB_AMI_ID_apne3 --query 'Images[].{AMIName:Name,AMIState:State}' --output table

下記のような出力結果が返ってきたら成功です。
    
    --------------------------------
    |        DescribeImages        |
    +----------------+-------------+
    |     AMIName    |  AMIState   |
    +----------------+-------------+
    |  HTTPS_DEMO_02 |  available  |
    +----------------+-------------+

### SecurityGroupを作成する
#### SecurityGroupの作成
EC2を作成する前に、EC2にアタッチするセキュリティグループを作成します。
今回は踏み台サーバー・WEBサーバー用に、2つのセキュリティグループを作成します。
**基本の構文**

    aws ec2 create-security-group --group-name <SG名> --description "<説明>" --vpc-id <VPCのID>
    
[参考:awscliコマンドリファレンス（create-security-group)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-security-group.html)

**実行したコマンド**
***・踏み台用VPC***
vpc-idには[前回](https://qiita.com/tonkatsu_oishi/private/7693570c405344b8f602)作成したVPCのIDを「VPC_ID」という変数に格納して指定しています。
また、後続の作業をやりやすくするために、返り値からSGのIDを取り出して「HTTPS_DEMO_BAT_SG」という変数に格納します。

    HTTPS_DEMO_BAT_SG=$(aws ec2 create-security-group --group-name HTTPS_DEMO_BAT_SG --description "HTTPS_DEMO_BAT_SG" --vpc-id $VPC_ID --query GroupId --output text)

下記コマンドを実行し、SGのIDを確認します。

    echo $HTTPS_DEMO_BAT_SG

***・WEBサーバー用VPC***
また、後続の作業をやりやすくするために、返り値からSGのIDを取り出して「HTTPS_DEMO_WEB_SG」という変数に格納します。

    HTTPS_DEMO_WEB_SG=$(aws ec2 create-security-group --group-name HTTPS_DEMO_WEB_SG --description "HTTPS_DEMO_WEB_SG" --vpc-id $VPC_ID --query GroupId --output text)

#### SecurityGroupへのNameタグ追加
先程作成したSGへNameタグを追加します。

    aws ec2 create-tags --resources $HTTPS_DEMO_BAT_SG --tags Key=Name,Value=HTTPS_DEMO_BAT_SG
    aws ec2 create-tags --resources $HTTPS_DEMO_WEB_SG --tags Key=Name,Value=HTTPS_DEMO_WEB_SG
    
#### 踏み台用SGへのインバウンドルール作成
踏み台サーバーへRDPやSSHを行えるよう、利用中の端末のグローバルIPをインバウンドルールで許可しておきます。

**基本の構文**

    aws ec2 authorize-security-group-ingress \
        --group-id <SGのID> \
        --protocol <tcp/udp/icmp/icmpv6> \
        --port <ポート番号> \
        --cidr <許可したいIPアドレス>

[参考:awscliコマンドリファレンス（authorize-security-group-ingress)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/authorize-security-group-ingress.html)

**実行したコマンド**
先程作成した踏み台用のSG（$HTTPS_DEMO_BAT_SG)を指定してインバウンドルールを作成します。

まずはSSH（22番）の通信を許可します。

    aws ec2 authorize-security-group-ingress \
        --group-id $HTTPS_DEMO_BAT_SG \
        --protocol tcp \
        --port 22 \
        --cidr ***.***.***.***/32

下記のような出力結果が返ってくれば成功です。

    {
        "Return": true,
        "SecurityGroupRules": [
            {
                "SecurityGroupRuleId": "sgr-******************",
                "GroupId": "sg-******************",
                "GroupOwnerId": "916134420985",
                "IsEgress": false,
                "IpProtocol": "tcp",
                "FromPort": 22,
                "ToPort": 22,
                "CidrIpv4": "106.179.12.210/32",
                "SecurityGroupRuleArn": "arn:aws:ec2:ap-northeast-3:***********:security-group-rule/***********"
            }
        ]
    }

RDP（3389）の通信も許可します。

    aws ec2 authorize-security-group-ingress \
        --group-id $HTTPS_DEMO_BAT_SG \
        --protocol tcp \
        --port 3389 \
        --cidr ***.***.***.***/32

下記のような出力結果が返ってくれば成功です。
    
    {
        "Return": true,
        "SecurityGroupRules": [
            {
                "SecurityGroupRuleId": "sgr-04fc091c234433ddc",
                "GroupId": "sg-******************",
                "GroupOwnerId": "916134420985",
                "IsEgress": false,
                "IpProtocol": "tcp",
                "FromPort": 3389,
                "ToPort": 3389,
                "CidrIpv4": "106.179.12.210/32",
                "SecurityGroupRuleArn": "arn:aws:ec2:ap-northeast-3:916134420985:security-group-rule/sgr-04fc091c234433ddc"
            }
        ]
    }

#### WEBサーバー用SGへのインバウンドルール作成
WEBサーバー用のSGには、踏み台用SGからのSSHとHTTP・HTTPS接続を許可します。
まずは22番のSSH接続を許可します。

    aws ec2 authorize-security-group-ingress \
        --group-id $HTTPS_DEMO_WEB_SG \
        --protocol tcp \
        --port 22 \
        --source-group $HTTPS_DEMO_BAT_SG

443番のHTTPS接続を許可します。

    aws ec2 authorize-security-group-ingress \
        --group-id $HTTPS_DEMO_WEB_SG \
        --protocol tcp \
        --port 443 \
        --source-group $HTTPS_DEMO_BAT_SG

80番のHTTP接続を許可します。

    aws ec2 authorize-security-group-ingress \
        --group-id $HTTPS_DEMO_WEB_SG \
        --protocol tcp \
        --port 80 \
        --source-group $HTTPS_DEMO_BAT_SG


#### SGの設定確認
各SGのルールが正しく設定されていることを確認します。

**基本の構文**

    aws ec2 describe-security-group-rules

[参考:awscliコマンドリファレンス（describe-security-group-rules)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-security-group-rules.html)

**実行したコマンド**

***踏み台用SGの確認***
まずは踏み台用SGに対してSGのルールを確認してみます。

    aws ec2 describe-security-group-rules \
     --filters "Name=group-id,Values=$HTTPS_DEMO_BAT_SG" \
     --query "SecurityGroupRules[*].{IsEgress:IsEgress,FromPort:FromPort,CIDR:CidrIpv4,FROMSGID:ReferencedGroupInfo.GroupId}" \
      --output table

下記のような出力結果が返ってくれば成功です。
「IsEgress」が「False」となっているものが、先ほど追加したインバウンドルールになっています。
        
    -----------------------------------------------------------
    |               DescribeSecurityGroupRules                |
    +--------------------+-----------+-----------+------------+
    |        CIDR        | FROMSGID  | FromPort  | IsEgress   |
    +--------------------+-----------+-----------+------------+
    |  ***.**.***.***/32 |  None     |  22       |  False     |
    |  ***.**.***.***/32 |  None     |  3389     |  False     |
    |  0.0.0.0/0         |  None     |  -1       |  True      |
    +--------------------+-----------+-----------+------------+


WEB用SGに対しても同様に確認してみます。
    
    aws ec2 describe-security-group-rules \
     --filters "Name=group-id,Values=$HTTPS_DEMO_WEB_SG" \
     --query "SecurityGroupRules[*].{IsEgress:IsEgress,FromPort:FromPort,CIDR:CidrIpv4,FROMSGID:ReferencedGroupInfo.GroupId}" \
      --output table

下記のような出力結果が返ってくれば成功です。
「IsEgress」が「False」となっているものが、先ほど追加したインバウンドルールになっています。
WEBサーバー用SGではCIDR範囲ではなくSGIDにてインバウンドルールを追加しているため、「FROMSGID」の部分が出力されています。
    
    ---------------------------------------------------------------
    |                 DescribeSecurityGroupRules                  |
    +-----------+------------------------+-----------+------------+
    |   CIDR    |       FROMSGID         | FromPort  | IsEgress   |
    +-----------+------------------------+-----------+------------+
    |  0.0.0.0/0|  None                  |  -1       |  True      |
    |  None     |  sg-*****************  |  80       |  False     |
    |  None     |  sg-*****************  |  22       |  False     |
    |  None     |  sg-*****************  |  443      |  False     |
    +-----------+------------------------+-----------+------------+


### EC2の構築
#### キーペアの作成
EC2に接続するにはキーペアが必要となります。
そのため、EC2を構築する前に、EC2インスタンス用のキーペアを作成します。

**基本の構文**

    aws ec2 create-key-pair --key-name <キーペア名> --key-type <キーペアのタイプ>
    
[参考:awscliコマンドリファレンス（create-key-pair)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-key-pair.html)

**実行したコマンド**
***Linuxサーバー用のキーペア***
Linuxサーバー用のキーペアのキータイプにはED25519を指定します。

※AmazonLinux2023では、ss-rsaが無効化されています。キータイプRSAのキーペアではデフォルト状態のAmazonLinux2023に接続できないのでご注意ください。
[参考：AmazonLinux2023 デフォルトのSSHサーバー設定](https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/ssh-host-keys-disabled.html)

キーペアを作成すると、返り値の「KeyMaterial」の部分にキーペアの秘密鍵の部分が出力されます。
そのため、「KeyMaterial」の内容を「HTTPS_DEMO_KEY_LINUX_OSAKA.pem」というファイルにリダイレクトします。

    aws ec2 create-key-pair --key-name HTTPS_DEMO_KEY_LINUX_OSAKA --key-type ed25519 --query "KeyMaterial" --output text > HTTPS_DEMO_KEY_LINUX_OSAKA.pem

***windowsサーバー用のキーペア***
OSがWindowsのEC2は、キータイプED25519に対応していません。
そのため、Windows用のキーペアのキータイプにはRSAを指定します。

Linux用のキーペアと同様に、「HTTPS_DEMO_KEY_WINDOWS_OSAKA.pem」に返り値の「KeyMaterial」をリダイレクトさせます。

    aws ec2 create-key-pair --key-name HTTPS_DEMO_KEY_WINDOWS_OSAKA --key-type rsa --query "KeyMaterial" --output text > HTTPS_DEMO_KEY_WINDOWS_OSAKA.pem

#### キーペアのダウンロード
キーペアの作成が完了したので、キーペアのファイルをダウンロードしておきます。
下記コマンドを実行し、ディレクトリの中身を表示します。

    ls -la

下記のような感じで、「HTTPS_DEMO_KEY_WINDOWS_OSAKA.pem」「HTTPS_DEMO_KEY_LINUX_OSAKA.pem」の二つのファイルが存在することを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/56a0d457-d196-2165-e23e-87ea1c0f5cd2.png)

下記コマンドを実行し、現在のディレクトリ階層を確認しておきます。

    pwd

現在のディレクトリ階層を控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/3cd7774a-22dc-6367-5ef2-0f0c3c08982d.png)

CloudShellの「アクション」ボタンを押下し、「ファイルのダウンロード」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/7b28e59d-dd36-e87c-f6bb-81d5e0b6a088.png)

「個別のファイルパスに」に先ほど確認したファイルパスと、ダウンロードしたいファイル名を入力し、「ダウンロード」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/93cd3d7c-f7dd-3d10-024c-37c68c3cf08b.png)

もう一つのキーペアも同様にダウンロードしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/6cd34fc4-8011-a3fe-ef7d-20ad597e99f2.png)

#### 踏み台用EC2のAMIIDを検索する
踏み台サーバーのEC2には、WindowsとAmazonLinuxのパブリックイメージの中から、最新のバージョンの物を指定して使用します。

ssmパラメータストアを利用して、Windows・AmazonLinuxAMIの最新のものを検索することができます。


**AmazonLinux2023のAMIを検索する**
AmazonLinux2023の最新のAMIを検索し、AMIIDを変数に格納します。

    LINUX_BAT_AMI=$(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 --query 'Parameters[0].Value' --output text)

[参考：Amazon Linux 1、Amazon Linux 2、および Amazon Linux 2023 の AMI パブリックパラメータを呼び出す](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/parameter-store-public-parameters-ami.html#public-parameters-ami-linux)

**WindowsのAMIIDを検索する**
WindowsServer2025の最新AMIを検索し、AMIIDを変数に格納します。
    
    WINDOWS_BAT_AMI=$(aws ssm get-parameters --names "/aws/service/ami-windows-latest/Windows_Server-2025-English-Full-Base" --query "Parameters[0].Value" --output text)

[参考：AMI 用の Windows Server パブリックパラメータを呼び出す](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/parameter-store-public-parameters-ami.html#public-parameters-ami-windows)

#### EC2を作成する
**Linux踏み台サーバーの作成**
Linuxの踏み台サーバーを作成します。

**基本の構文**

    aws ec2 run-instances \
      --image-id <AMIID> \
      --count <インスタンス数> \
      --instance-type <インスタンスタイプ> \
      --key-name <キーペア名> \
      --subnet-id <構築先サブネット> \
      --associate-public-ip-address(パブリックサブネットIPを有効化する場合に付与） \
      --private-ip-address <プライベートIPアドレス> \
      --security-group-ids <SGのID> \
      --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"DeleteOnTermination":true}}]' \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=<Nameタグ>}]' 

[参考:awscliコマンドリファレンス（run-instances)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html)

**実行したコマンド**
先程検索したAmazonLinuxのAMIを指定して、EC2を立ち上げます。
インスタンスタイプはt3.micro、キーペアにはLinux用のキーペアを指定しています。
サブネットはaz3aのパブリックサブネットを指定し、プライベートIPアドレスは「172.31.0.6」を指定します。
返り値から「InstanceId」の部分を変数に格納します。

    LINUX_BASTION=$(aws ec2 run-instances \
      --image-id $LINUX_BAT_AMI \
      --count 1 \
      --instance-type t3.micro \
      --key-name HTTPS_DEMO_KEY_LINUX_OSAKA \
      --subnet-id $HTTPS_DEMO_SUB_PUB3a \
      --associate-public-ip-address \
      --private-ip-address 172.31.0.5 \
      --security-group-ids $HTTPS_DEMO_BAT_SG \
      --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"DeleteOnTermination":true}}]' \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=HTTPS_DEMO_BAT01}]' \
      --query Instances[0].InstanceId --output text)

**Windows踏み台サーバーの作成**
同じ要領で、Windowsの踏み台サーバーも作成します。
AMIには先程検索したWindowsServer2025の最新AMIを指定します。
インスタンスタイプはt3.medium、キーペアにはWindows用のキーペアを指定しています。
サブネットはaz3aのパブリックサブネットを指定し、プライベートIPアドレスは「172.31.0.6」を指定します。
WindowsサーバーはルートデバイスとなるEBSのサイズが32GB以上必要となるため、ディスクサイズを50に指定しています。

    WINDOWS_BASTION=$(aws ec2 run-instances \
      --image-id $WINDOWS_BAT_AMI \
      --count 1 \
      --instance-type t3.medium \
      --key-name HTTPS_DEMO_KEY_WINDOWS_OSAKA \
      --subnet-id $HTTPS_DEMO_SUB_PUB3a \
      --associate-public-ip-address \
      --private-ip-address 172.31.0.6 \
      --security-group-ids $HTTPS_DEMO_BAT_SG \
      --block-device-mappings "DeviceName=/dev/sda1,Ebs={VolumeSize=50,DeleteOnTermination=true}" \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=HTTPS_DEMO_BAT02}]' \
      --query Instances[0].InstanceId --output text)

Windowsサーバーは、ログイン時にキーペアを指定してパスワードを復号化する必要があります。
下記コマンドを実行しパスワードを復号化し、手元に控えておきます。

    aws ec2 get-password-data --instance-id $WINDOWS_BASTION --priv-launch-key HTTPS_DEMO_KEY_WINDOWS_OSAKA.pem --query PasswordData --output text

**WEB1/2の作成**
プライベートサブネット上にWEBサーバーを2台作成します。
AMIには、東京リージョンからコピーしてきたAMI（$WEB_AMI_ID_apne3）を指定します。
WEB1は、AZ31のプライベートサブネットを指定します。

    WEB_01=$(aws ec2 run-instances \
      --image-id $WEB_AMI_ID_apne3 \
      --count 1 \
      --instance-type t3.micro \
      --key-name HTTPS_DEMO_KEY_LINUX_OSAKA \
      --subnet-id $HTTPS_DEMO_SUB_PRV3a \
      --private-ip-address 172.31.1.5 \
      --security-group-ids $HTTPS_DEMO_WEB_SG \
      --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"DeleteOnTermination":true}}]' \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=HTTPS_DEMO_WEB01}]' \
      --query Instances[0].InstanceId --output text)

WEB2も同様に作成します。
WEB2は、AZ3cのプライベートサブネットを指定します。
    
    WEB_02=$(aws ec2 run-instances \
      --image-id $WEB_AMI_ID_apne3 \
      --count 1 \
      --instance-type t3.micro \
      --key-name HTTPS_DEMO_KEY_LINUX_OSAKA \
      --subnet-id $HTTPS_DEMO_SUB_PRV3c \
      --private-ip-address 172.31.5.5 \
      --security-group-ids $HTTPS_DEMO_WEB_SG \
      --block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"DeleteOnTermination":true}}]' \
      --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=HTTPS_DEMO_WEB02}]' \
      --query Instances[0].InstanceId --output text)

これで、すべてのEC2を構築することができました。
Linux・Windowsの踏み台サーバーにログインし、SSH接続が行えることを確認します。

※接続手順については今回は割愛します。
Linuxからの接続手順は[こちら](https://qiita.com/tonkatsu_oishi/items/9ffdd560624f25dc7fa9)をご参照ください。
Windowsからの接続手順は[こちら](https://qiita.com/tonkatsu_oishi/items/27bec9679b247a035757)をご参照ください。

今回ご紹介する手順は以上となります。
ここまでお読みくださりありがとうございました。