😀

Amazon VPCをAWS CLIで構築する手順①

2022/04/10に公開

はじめに

先日、改めてネットワークの勉強をしたく「AWS Hands-on for Beginners」を受講しました。
その数日後、4/7にJAWS-UG CLI専門支部でAmazon VPC(以下VPC)構築のハンズオンを受講しました。両方の復習のためにVPCをAWS CLIで構築してみようと思います。まずは、VPCの作成とサブネットの作成について書いていきます。

ハンズオンの手順を参考にしながらやりますが、プラスアルファのことを加えてやってみたいと思います。

※注意
ハンズオンで学んだことを基にしてコマンド実行しながら書きますが、認識違いや補足などがありましたらご指摘いただけますと幸いです。
また、記載内容を参考にする場合は自己責任でお願いいたします。

AWS Hands-on for Beginners

https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/?trk=aws_blog

JAWS-UG CLI専門支部 #253R EC2基礎 (VPC)

https://jawsug-cli.connpass.com/event/243226/

構成図

  • 東京リージョン
  • マルチAZ(アベイラビリティゾーン)構成
  • パブリックサブネット2つ(各AZに1つずつ)
  • プライベートサブネット2つ(各AZに1つずつ)

手順

1.作業環境構築

自分は、普段CLI専門支部のハンズオンで構築している環境を構築して実施しました。
他に作業環境がある方はそちらを使っても良いと思います。

http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-cloud9-environment-cfn/index.html

Cloud9環境からEC2・VPC関連のAPIを実行するために権限(IAMロール)を付与します。
今回は「AmazonEC2FullAccess」を付与します。

http://prototype-handson-cli.s3-website-ap-northeast-1.amazonaws.com/handson_light-aws_service/handson_light-aws_service-ec2_vpc/iam-instance_profile-update-expand-policy-attach-aws-cloudshell.html

2.VPC構築

①リージョンを環境変数に指定

VPCを作成するリージョンを環境変数に指定します。この手順では東京リージョンを指定します。

export AWS_DEFAULT_REGION='ap-northeast-1'

②各種変数の指定

<CIDRブロック>と<VPCタグ>を変数に指定します。ちなみに、VPCには名前ではなく、タグ名でVPCを識別します。

VPCタグ

EC2_VPC_TAG_NAME='handson-cli-vpc'

VPCのCIDRブロック

EC2_VPC_CIDR='10.0.0.0/16'

VPCタグ文字列

STRING_EC2_VPC_TAG="ResourceType=vpc,Tags=[{Key=Name,Value=${EC2_VPC_TAG_NAME}}]" \
&& echo ${STRING_EC2_VPC_TAG}
ResourceType=vpc,Tags=[{Key=Name,Value=handson-cli-vpc}]

③VPC作成コマンド実行

以下のコマンドを実行します。

aws ec2 create-vpc \
  --cidr-block ${EC2_VPC_CIDR} \
  --tag-specifications ${STRING_EC2_VPC_TAG}

成功すると以下のように表示されます

{
    "Vpc": {
        "CidrBlock": "10.0.0.0/16",
        "DhcpOptionsId": "dopt-xxxxxxxxxxxxxxxxx",
        "State": "pending",
        "VpcId": "vpc-xxxxxxxxxxxxxxxxxx",
        "OwnerId": "XXXXXXXXXXXXX",
        "InstanceTenancy": "default",
        "Ipv6CidrBlockAssociationSet": [],
        "CidrBlockAssociationSet": [
            {
                "AssociationId": "vpc-cidr-assoc-xxxxxxxxxxxxxxxxx",
                "CidrBlock": "10.0.0.0/16",
                "CidrBlockState": {
                    "State": "associated"
                }
            }
        ],
        "IsDefault": false,
        "Tags": [
            {
                "Key": "Name",
                "Value": "<VPCタグ名>"
            }
        ]
    }
}

④VPCの作成確認

指定したVPCタグ名でVPCが作られていることを以下のコマンドを実行します。

※filterでAPI側から指定の値でフィルタかけて出力、queryでさらにJSONから指定の値を抽出するといったイメージだと思います。違ってたらご指摘ください。

aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
  --query 'Vpcs[].Tags[?Key == `Name`].Value' \
  --output text

以下のように表示されます。VPCタグ名通りの文字列が表示されればOKです。

handson-cli-vpc

3.サブネットの作成

①リージョンを環境変数に指定

VPCを作成するリージョンを環境変数に指定します。この手順では東京リージョンを指定します。

export AWS_DEFAULT_REGION='ap-northeast-1'

②各種変数の指定

<VPC ID>、<CIDRブロック>、<アベイラビリティソーン>、<サブネットタグ名>を変数に指定します。ちなみに、サブネットにも名前を付けられませんので、タグ名を付けます。

ap-northeath-1a でパブリックサブネットを作成したい場合は、以下の通り変数を指定していきます。

VPCタグ

EC2_VPC_TAG_NAME='handson-cli-vpc'

AZコード(ap-northeast-1a:a、ap-northeast-1c:c)

EC2_AZ_CODE="a"

サブネットの種類(パブリックサブネット:public、プライベートサブネット:private)

EC2_SUBNET_TYPE="public"

サブネットタグ名

EC2_SUBNET_TAG_NAME="handson-cli-"${EC2_SUBNET_TYPE}"-subnet-"${EC2_AZ_CODE} \
&& echo ${EC2_SUBNET_TAG_NAME}
handson-cli-public-subnet-a

サブネットのCIDRブロック

EC2_SUBNET_CIDR='10.0.10.0/24'

アベイラビリティソーン(ap-northeast-1a、ap-northeast-1c)

EC2_AZ_NAME=${AWS_DEFAULT_REGION}${EC2_AZ_CODE} \
&& echo ${EC2_AZ_NAME}
ap-northeast-1a

タグ文字列

STRING_EC2_SUBNET_TAG="ResourceType=subnet,Tags=[{Key=Name,Value=${EC2_SUBNET_TAG_NAME}}]" \
&& echo ${STRING_EC2_SUBNET_TAG}
ResourceType=subnet,Tags=[{Key=Name,Value=handson-cli-public-subnet-a}]

VPC ID

EC2_VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
  && echo ${EC2_VPC_ID}

③サブネット作成コマンド実行

以下のコマンドを実行します。

aws ec2 create-subnet \
  --vpc-id ${EC2_VPC_ID} \
  --cidr-block ${EC2_SUBNET_CIDR} \
  --availability-zone ${EC2_AZ_NAME} \
  --tag-specifications ${STRING_EC2_SUBNET_TAG}

成功すると以下のように表示されます。

{
    "Subnet": {
        "AvailabilityZone": "<AZ>",
        "AvailabilityZoneId": "<AZID>",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "<CIDRブロック>",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        "SubnetId": "subnet-xxxxxxxxxxxxxxxxx",
        "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
        "OwnerId": "XXXXXXXXXXXX",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "<サブネットタグ名>"
            }
        ],
        "SubnetArn": "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:subnet/subnet-xxxxxxxxxxxxxxxxx",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}

④サブネット作成確認

作成されたサブネットのタグ名が正しいか確認します。

aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query 'Subnets[].Tags[?Key==`Name`].Value' \
  --output text

以下のように表示されます。指定したサブネットタグ名が表示されればOKです。

handson-cli-public-subnet-a

作成されたCIDRブロックが正しいか確認します。

aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query "Subnets[].CidrBlock" \
  --output text

以下のように表示されます。サブネットに設定したCIDRが表示されればOKです。

10.0.10.0/24

作成されたAZが正しいか確認します。

aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}  \
  --query "Subnets[].AvailabilityZone" \
  --output text

以下のように表示されます。指定のAZが表示されればOKです。

ap-northeast-1a

複数のサブネットを作成するためには、別ターミナルを開き、変数を入れ替えて①~④を実行します。

⑤全サブネットの作成確認

すべてのサブネットの作成コマンドを実行したら、もう一度作成サブネットが表示されるか確認します。

aws ec2 describe-subnets \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
  --query 'Subnets[].Tags[?Key == `Name`].Value' \
  --output text

今回の構成図に沿って4つサブネットを作成すると、以下のように表示されます。

handson-cli-public-subnet-a
handson-cli-private-subnet-a
handson-cli-private-subnet-c
handson-cli-public-subnet-c

パブリックサブネットにするには、ルートテーブルの作成とインターネットゲートウェイを作成して、適切な設定をすることでパブリックサブネットとなります。次回書きます。

最後に

まずは、VPCとサブネットを作成するところまでAWS CLIでやってみました。
次回以降に、セキュリティグループの設定とルートテーブルの設定、インスタンスの作成、インターネットゲートウェイの作成とアタッチをやってみたいと思います。また書けるところまで書いていこうと思います。

次の記事
https://zenn.dev/amarelo_n24/articles/30cb58cad805e8

Discussion