LoginSignup
0
0

More than 1 year has passed since last update.

AWS CLI VPC

Posted at

はじめに

AWS CLIでVPCにEC2を作成し疎通の確認を取ります。
CLIの勉強をしたのでアウトプット目的です。

対象者

この記事は下記のような人を対象にしています。

  • 駆け出しエンジニア
  • AWS CLIについて全くわからない方、勉強したい方

環境

CLIで作業をしますので以下環境です。

// OSとバージョンの確認
cat /etc/system-release
Amazon Linux release 2 (Karoo)

// シェルとバージョンの確認
bash --version \
  | head -1
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)

// AWS CLIのバージョンの確認
aws --version
aws-cli/1.20.56 Python/3.7.10 Linux/4.14.246-187.474.amzn2.x86_64 botocore/1.21.56

段落

①VPCの作成
②サブネットの作成
③セキュリティグループ作成
④ルートテーブルの作成
⑤ルートテーブルとサブネットの紐付け
⑥インターネットゲートウェイ作成
⑦インターネットゲートウェイとVPCの紐付け

VPCの作成

// リージョン指定
export AWS_DEFAULT_REGION='ap-northeast-1'

// VPCのタグ名指定
EC2_VPC_TAG_NAME='handson-cli-vpc'

// VPCのCIDRを指定
EC2_VPC_CIDR='10.0.0.0/16'

// タグ文字列の指定
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}]

create-vpcで作成VPCにタグを割り当てるには以下のような構文する必要がある
ResourceType=string,Tags=[{Key=string,Value=string}]
{Key=string,Value=string}は一つでも可能だが、スペースなど空けずに詰めて書かないとエラーになる

// VPVの作成
aws ec2 create-vpc \
  --cidr-block ${EC2_VPC_CIDR} \
  --tag-specifications ${STRING_EC2_VPC_TAG}

{
    "Vpc": {
        "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
        "InstanceTenancy": "default",
        "Tags": [
            "Value": "handson-cli-vpc",
            "Key": "Name"
        ],
        "CidrBlockAssociationSet": [
            {
                "AssociationId": "vpc-cidr-assoc-xxxxxxxx",
                "CidrBlock": "10.0.0.0/16",
                "CidrBlockState": {
                    "State": "associated"
                }
            }
        ],
        "Ipv6CidrBlockAssociationSet": [],
        "State": "pending",
        "DhcpOptionsId": "dopt-xxxxxxxx",
        "CidrBlock": "vpc-xxxxxxxxxxxxxxxxx",
        "OwnerId": "XXXXXXXXXXXX",
        "IsDefault": false
    }
}

// 作成したVPCの存在確認
aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME}  \
  --query 'Vpcs[].Tags[?Key == `Name`].Value' \
  --output text

handson-cli-vpc

// 作成したVPCのCIDRの確認
aws ec2 describe-vpcs \
> --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME} \
> --query "Vpcs[].CidrBlock" \
> --output text

10.0.0.0/16

サブネットの作成

// サブネット名の指定
EC2_SUBNET_TAG_NAME='handson-cli-subnet'

// サブネットのCIDRを指定
EC2_SUBNET_CIDR='10.0.0.0/24'

// AZを指定
EC2_AZ_NAME='ap-northeast-1a'

// 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}

vpc-0d627a55f8e265976

// サブネットのタグを作成する
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-subnet}]

// サブネットを作成する
aws ec2 create-subnet \
> --tag-specifications ${STRING_EC2_SUBNET_TAG} \
> --cidr-block ${EC2_SUBNET_CIDR} \
> --vpc-id ${EC2_VPC_ID} \
> --availability-zone ${EC2_AZ_NAME} 

{
    "Subnet": {
        "AvailabilityZone": "ap-northeast-1a",
        "AvailabilityZoneId": "apne1-az4",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.0.0/24",
・・・・以下略


// 作成したサブネットの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

10.0.0.0/24

// 作成したサブネットのIDの確認
aws ec2 describe-subnets \ 
--filters Name=vpc-id,Values=${EC2_VPC_ID}Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME} 
--query Subnets[].SubnetId \ 
--output text

subnet-0af8f1c36db7c04f0

// 作成したサブネットが存在することを確認
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

handson-cli-subnet

セキュリティグループの作成

// セキュリティーグループ名の指定
EC2_SECURITY_GROUP_NAME='handson-cli-sg'

//セキュリティグループの説明を指定
EC2_SECURITY_DESCRIPTTION='handson-cli SecurityGroup.'

//セキュリティグループの作成
aws ec2 create-security-group \
>   --group-name ${EC2_SECURITY_GROUP_NAME} \
>   --description "${EC2_SECURITY_GROUP_DESCRIPTION}" \
>   --vpc-id ${EC2_VPC_ID}

{
    "GroupId": "sg-089bac6aeeda2d58e"
}

// 作成したセキュリティグループの存在の確認
aws ec2 describe-security-groups \
> --filter Name=vpc-id,Values=${EC2_VPC_ID} \
>  --query 'SecurityGroups[].GroupName' \
>   --output text

handson-cli-sg  default

--descriptionには""で囲わないとエラーとなりますので注意が必要です。

ルートテーブルの作成

// ルートテーブル名の指定
EC2_ROUTE_TABLE_TAG_NAME='handson-cli-public-routetable'

// 作成するルートテーブルのタグを指定
STRING_EC2_ROUTE_TABLE_TAG="ResourceType=route-table,Tags=[{Key=Name,Value=${EC2_ROUTE_TABLE_TAG_NAME}}]" \
> && echo ${STRING_EC2_ROUTE_TABLE_TAG}

ResourceType=route-table,Tags=[{Key=Name,Value=handson-cli-public-routetable}]

// ルートテーブルの作成
aws ec2 create-route-table \
> --vpc-id  ${EC2_VPC_ID} \
> --tag-specifications ${STRING_EC2_ROUTE_TABLE_TAG} 
{
    "RouteTable": {
・・・以下略

// 作成したルートテーブルの存在確認
aws ec2 describe-route-tables \
>   --filters Name=vpc-id,Values=${EC2_VPC_ID} \
>             Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
>   --query "RouteTables[].Tags[?Key == \`Name\`].Value" \
>   --output text

handson-cli-public-routetable

ルートテーブルをサブネットへ紐付け

// ルートテーブルIDを取得
EC2_ROUTE_TABLE_=$( \
aws ec2 describe-route-tables \
--filters Name=vpc-id,Values=${EC2_VPC_ID} \
Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME} \
--query RouteTables[].RouteTableId \
--output text \
) && echo ${EC2_ROUTE_TABLE_}

rtb-01d71110c1e615ec4

// サブネットIDの取得
EC2_SUBNET_ID=$( \
aws ec2 describe-subnets \
--filters Name=vpc-id,Values=${EC2_VPC_ID} \
Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME} \
--query Subnets[].SubnetId  \
--output text
) && echo ${EC2_SUBNET_ID}

subnet-0af8f1c36db7c04f0

// ルートテーブルをサブネットに紐付け
aws ec2 associate-route-table \
> --route-table-id ${EC2_ROUTE_TABLE_ID} \
> --subnet-id ${EC2_SUBNET_ID}
{
    "AssociationId": "rtbassoc-06dea3d4353c422c8",
    "AssociationState": {
        "State": "associated"
    }
}

// ルートテーブルがサブネットに紐付けされているか確認
aws ec2 describe-route-tables \
> --route-table-ids ${EC2_ROUTE_TABLE_ID} \
> --query "RouteTables[].Associations[?SubnetId== \`${EC2_SUBNET_ID}\`].RouteTableAssociationId" \
> --output text

rtbassoc-06dea3d4353c422c8

インターネットゲートウェイの作成

// インターネットゲートウェイ名を指定
EC2_INTERNET_GATEWAY_TAG_NAME='handson-cli-igw'

// タグ名を指定
STRING_EC2_INTERNET_GATEWAY_TAG="ResourceType=internet-gateway,Tags=[{Key=Name,Value=${EC2_INTERNET_GATEWAY_TAG_NAME}}]" \
  && echo ${STRING_EC2_INTERNET_GATEWAY_TAG}

ResourceType=internet-gateway,Tags=[{Key=Name,Value=handson-cli-igw}]

//インターネットゲートウェイを作成
aws ec2 create-internet-gateway \
> --tag-specifications ${STRING_EC2_INTERNET_GATEWAY_TAG} 
{
    "InternetGateway": {
        "Attachments": [],
        "InternetGatewayId": "igw-03f61f722ec6fd242",
        "OwnerId": "302471719360",
        "Tags": [
            {
                "Key": "Name",
                "Value": "handson-cli-igw"
            }
        ]
    }
}

// インターネットゲートウェイの存在を確認
aws ec2 describe-internet-gateways \
--filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME} \ 
--query InternetGateways[].Tags[].Value \
--output text

handson-cli-igw

インターネットゲートウェイをVPCにアタッチ

// インターネットゲートウェイIDを取得
EC2_INTERNETGATEWAY_ID=$( \
aws ec2 describe-internet-gateways \
--filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME} \
--query InternetGateways[].InternetGatewayId  \
--output text \
> ) \
> && echo ${EC2_INTERNETGATEWAY_ID}

igw-03f61f722ec6fd242

// インターネットゲートウェイをVPCにアタッチ
aws ec2 attach-internet-gateway \
> --internet-gateway-id ${EC2_INTERNETGATEWAY_ID} \
> --vpc-id  ${EC2_VPC_ID}

// VPCにインターネットゲートウェイがアタッチされているか確認
aws ec2 describe-internet-gateways \
>   --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME}  \
>   --query "InternetGateways[].Attachments[?VpcId == \`${EC2_VPC_ID}\`].VpcId" \
>   --output text

vpc-0d627a55f8e265976

ルートの作成

// ルート名を指定
EC2_ROUTE_TABLE_TAG_NAME='handson-cli-public-routetable'

// ルートのアドレスを指定
EC2_ROUTE_DESTINATION_CIDR='0.0.0.0/0'

// ルートの作成
aws ec2 create-route  \ 
--route-table-id ${EC2_ROUTE_TABLE_ID}  \
--destination-cidr-block ${EC2_ROUTE_DESTINATION_CIDR} \
 --gateway-id ${EC2_INTERNETGATEWAY_ID}
{
    "Return": true
}

// ルートが0.0.0.0/0に存在することを確認
aws ec2 describe-route-tables \ 
--filters Name=vpc-id,Values=${EC2_VPC_ID}Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME} Name=vpc-id,Values=${EC2_VPC_ID} \
--query "RouteTables[].Routes[?DestinationCidrBlock == \`${EC2_ROUTE_DESTINATION_CIDR}\`].DestinationCidrBlock" \
--output text

0.0.0.0/0

// ルートがインターネットゲートウェイにアタッチされているか確認
aws ec2 describe-route-tables \
  --filters Name=vpc-id,Values=${EC2_VPC_ID} \
            Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME}  \
  --query "RouteTables[].Routes[?DestinationCidrBlock == \`${EC2_ROUTE_DESTINATION_CIDR}\`].GatewayId" \
  --output text

igw-xxxxxxxxxxxxxxxxx

作成した際にtrueが帰ってくると成功です。
それ以外の場合は、エラーを返します。

参考

AWS CLIリファレンス

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0