AWS CLIでVPCの構築からEC2の構築まで

  • 2019.10.11
  • AWS
AWS CLIでVPCの構築からEC2の構築まで

はじめに

AWSのほんのさわりの部分は分かってきたので、そろそろCLIに手を出そうかと思います。まずはVPCを構築し、サブネットを作って、EC2を構築するところまでをやってみたいと思います。

AWS CLIの準備

MacOS Mojave、Python 3.6.8、pip 19.1.1 の環境でやってみました。

まずはAWSマネジメントコンソールより IAM を開きます。

ユーザーの認証情報から、アクセスキーを作成し、Access Key と Access Secret Key を取得します。

次に以下のコマンドでインストールします。

$ pip install awscli

それから次のコマンドを実行すると初期設定が行えます。ここで取得しておいた Access Key と Access Secret Key を入力します。

デフォルトの Region は 東京リージョン(ap-northeast-1)としておきました。

$ aws configure

これでインストール完了です。

VPCの作成

とりあえず現在のVPCのリストを取得してみます。

$ aws ec2 describe-vpcs

10.0.0.0/16のセグメントはすでに作成してあったため、10.1.0.0/16のセグメントにVPCを作成してみます。

$ aws ec2 create-vpc --cidr-block 10.1.0.0/16

作成したVPCのIDを確認します。

$ aws ec2 describe-vpcs

{
    "Vpcs": [
        {
            "CidrBlock": "10.1.0.0/16",
            "DhcpOptionsId": "dopt-70b2ea17",
            "State": "available",
            "VpcId": "vpc-04e72e6413b624d29",
            "OwnerId": "281230433728",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-0881ba835faad6c8b",
                    "CidrBlock": "10.1.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false
        }
    ]
}

VPC IDがわかりましたので、そのVPCにタグ Name を追加しておきます。

$ aws ec2 create-tags --resources vpc-04e72e6413b624d29 --tags Key=Name,Value=myvpc02

タグ Name が追加されました。

$ aws ec2 describe-vpcs
{
    "Vpcs": [
        {
            "CidrBlock": "10.1.0.0/16",
            "DhcpOptionsId": "dopt-70b2ea17",
            "State": "available",
            "VpcId": "vpc-04e72e6413b624d29",
            "OwnerId": "281230433728",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-0881ba835faad6c8b",
                    "CidrBlock": "10.1.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "myvpc02"
                }
            ]
        }
    ]
}

DNSホスト名も有効にしておきます。

$ aws ec2 modify-vpc-attribute  --vpc-id vpc-04e72e6413b624d29 --enable-dns-hostname

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

次のコマンドでインターネットゲートウェイを作成します。

$ aws ec2 create-internet-gateway
{
    "InternetGateway": {
        "Attachments": [],
        "InternetGatewayId": "igw-07a1edf1ae62b92a5",
        "Tags": []
    }
}

タグName を作成しておきます。

$ aws ec2 create-tags --resources igw-07a1edf1ae62b92a5 --tags Key=Name,Value=igw-mygateway2

次のコマンドでVPCにアタッチします。

$ aws ec2 attach-internet-gateway --internet-gateway-id igw-07a1edf1ae62b92a5 --vpc-id vpc-04e72e6413b624d29

正常に割り当てられていることを確認します。

$ aws ec2 describe-internet-gateways --filters Name=internet-gateway-id,Values=igw-07a1edf1ae62b92a5
{
    "InternetGateways": [
        {
            "Attachments": [
                {
                    "State": "available",
                    "VpcId": "vpc-04e72e6413b624d29"
                }
            ],
            "InternetGatewayId": "igw-07a1edf1ae62b92a5",
            "OwnerId": "281230433728",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "igw-mygateway2"
                }
            ]
        }
    ]
}

ルートテーブルの設定

VPCを作成したときに自動的にルートテーブルも作成されていますが、分かりにくくなるのでここでも名前をつけておきます。

まずは作成したVPCに割り当てられているルートテーブルIDを取得します。

$ aws ec2 describe-route-tables --filter Name=vpc-id,Values=vpc-04e72e6413b624d29
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "Main": true,
                    "RouteTableAssociationId": "rtbassoc-04b17df54a722341a",
                    "RouteTableId": "rtb-0e959c6390ba6708b"
                }
            ],
            "PropagatingVgws": [],
            "RouteTableId": "rtb-0e959c6390ba6708b",
            "Routes": [
                {
                    "DestinationCidrBlock": "10.1.0.0/16",
                    "GatewayId": "local",
                    "Origin": "CreateRouteTable",
                    "State": "active"
                }
            ],
            "Tags": [],
            "VpcId": "vpc-04e72e6413b624d29",
            "OwnerId": "281230433728"
        }
    ]
}

次のコマンドでタグNameを割り当てます。

$ aws ec2 create-tags --resources rtb-0e959c6390ba6708b --tags Key=Name,Value=rtb-mytable2

次にルートテーブルにインターネットへ抜けていく経路を追加します。

$ aws ec2 create-route --route-table-id rtb-0e959c6390ba6708b --destination-cidr-block 0.0.0.0/0 --gateway-id igw-07a1edf1ae62b92a5

ルートテーブルが正しく設定されているか確認します。

$ aws ec2 describe-route-tables --filter Name=route-table-id,Values=rtb-0e959c6390ba6708b
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "Main": true,
                    "RouteTableAssociationId": "rtbassoc-04b17df54a722341a",
                    "RouteTableId": "rtb-0e959c6390ba6708b"
                }
            ],
            "PropagatingVgws": [],
            "RouteTableId": "rtb-0e959c6390ba6708b",
            "Routes": [
                {
                    "DestinationCidrBlock": "10.1.0.0/16",
                    "GatewayId": "local",
                    "Origin": "CreateRouteTable",
                    "State": "active"
                },
                {
                    "DestinationCidrBlock": "0.0.0.0/0",
                    "GatewayId": "igw-07a1edf1ae62b92a5",
                    "Origin": "CreateRoute",
                    "State": "active"
                }
            ],
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "rtb-mytable2"
                }
            ],
            "VpcId": "vpc-04e72e6413b624d29",
            "OwnerId": "281230433728"
        }
    ]
}

サブネットの作成

今回は次回以降も使いたい構成があるので次のようにサブネットを作っていきたいと思います。

まずはひとつめのサブネットを作成します。とその前にAvailability Zone の確認です。

$ aws ec2 describe-availability-zones
{
    "AvailabilityZones": [
        {
            "State": "available",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1a",
            "ZoneId": "apne1-az4"
        },
        {
            "State": "available",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1c",
            "ZoneId": "apne1-az1"
        },
        {
            "State": "available",
            "Messages": [],
            "RegionName": "ap-northeast-1",
            "ZoneName": "ap-northeast-1d",
            "ZoneId": "apne1-az2"
        }
    ]
}

ap-northeast-1a と ap-northeast-1c にそれぞれサブネットを作ることにします。

次のコマンドで作成します。

$ aws ec2 create-subnet --availability-zone ap-northeast-1a --cidr-block 10.1.0.0/24 --vpc-id vpc-04e72e6413b624d29
$ aws ec2 create-subnet --availability-zone ap-northeast-1c --cidr-block 10.1.1.0/24 --vpc-id vpc-04e72e6413b624d29

正しく作成されたことを確認します。

$ aws ec2 describe-subnets --filters Name=vpc-id,Values=vpc-04e72e6413b624d29
{
    "Subnets": [
        {
            "AvailabilityZone": "ap-northeast-1c",
            "AvailabilityZoneId": "apne1-az1",
            "AvailableIpAddressCount": 251,
            "CidrBlock": "10.1.1.0/24",
            "DefaultForAz": false,
            "MapPublicIpOnLaunch": false,
            "State": "available",
            "SubnetId": "subnet-0f2edab09ccc98c0f",
            "VpcId": "vpc-04e72e6413b624d29",
            "OwnerId": "281230433728",
            "AssignIpv6AddressOnCreation": false,
            "Ipv6CidrBlockAssociationSet": [],
            "SubnetArn": "arn:aws:ec2:ap-northeast-1:281230433728:subnet/subnet-0f2edab09ccc98c0f"
        },
        {
            "AvailabilityZone": "ap-northeast-1a",
            "AvailabilityZoneId": "apne1-az4",
            "AvailableIpAddressCount": 251,
            "CidrBlock": "10.1.0.0/24",
            "DefaultForAz": false,
            "MapPublicIpOnLaunch": false,
            "State": "available",
            "SubnetId": "subnet-0b99e52d17314979d",
            "VpcId": "vpc-04e72e6413b624d29",
            "OwnerId": "281230433728",
            "AssignIpv6AddressOnCreation": false,
            "Ipv6CidrBlockAssociationSet": [],
            "SubnetArn": "arn:aws:ec2:ap-northeast-1:281230433728:subnet/subnet-0b99e52d17314979d"
        }
    ]
}

よく見たら MapPublicIpOnLaunch が false になっていたので、true に変更しておきます。

$ aws ec2 modify-subnet-attribute --map-public-ip-on-launc --subnet-id subnet-0b99e52d17314979d
$ aws ec2 modify-subnet-attribute --map-public-ip-on-launc --subnet-id subnet-0f2edab09ccc98c0f
$ aws ec2 describe-subnets --filters Name=vpc-id,Values=vpc-04e72e6413b624d29
{
    "Subnets": [
        {
            "AvailabilityZone": "ap-northeast-1c",
            "AvailabilityZoneId": "apne1-az1",
            "AvailableIpAddressCount": 251,
            "CidrBlock": "10.1.1.0/24",
            "DefaultForAz": false,
            "MapPublicIpOnLaunch": true,
            "State": "available",
            "SubnetId": "subnet-0f2edab09ccc98c0f",
            "VpcId": "vpc-04e72e6413b624d29",
            "OwnerId": "281230433728",
            "AssignIpv6AddressOnCreation": false,
            "Ipv6CidrBlockAssociationSet": [],
            "SubnetArn": "arn:aws:ec2:ap-northeast-1:281230433728:subnet/subnet-0f2edab09ccc98c0f"
        },
        {
            "AvailabilityZone": "ap-northeast-1a",
            "AvailabilityZoneId": "apne1-az4",
            "AvailableIpAddressCount": 251,
            "CidrBlock": "10.1.0.0/24",
            "DefaultForAz": false,
            "MapPublicIpOnLaunch": true,
            "State": "available",
            "SubnetId": "subnet-0b99e52d17314979d",
            "VpcId": "vpc-04e72e6413b624d29",
            "OwnerId": "281230433728",
            "AssignIpv6AddressOnCreation": false,
            "Ipv6CidrBlockAssociationSet": [],
            "SubnetArn": "arn:aws:ec2:ap-northeast-1:281230433728:subnet/subnet-0b99e52d17314979d"
        }
    ]
}

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

次のコマンドでセキュリティグループを作成します。

$ aws ec2 create-security-group --group-name mysecgroup2 --description "My SecurityGroup" --vpc-id vpc-04e72e6413b624d29
{
    "GroupId": "sg-04b4e7642a8fc6efe"
}

作成されたセキュリティグループの内容を確認してみます。

$ aws ec2 describe-security-groups --filter Name=group-id,Values=sg-04b4e7642a8fc6efe
{
    "SecurityGroups": [
        {
            "Description": "My SecurityGroup",
            "GroupName": "mysecgroup2",
            "IpPermissions": [],
            "OwnerId": "281230433728",
            "GroupId": "sg-04b4e7642a8fc6efe",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-04e72e6413b624d29"
        }
    ]
}

外からsshで接続できるように設定します。

$ aws ec2 authorize-security-group-ingress --group-id sg-04b4e7642a8fc6efe --protocol tcp --port 22 --cidr 0.0.0.0/0

もう一度設定されているかセキュリティグループを確認してみます。

$ aws ec2 describe-security-groups --filter Name=group-id,Values=sg-04b4e7642a8fc6efe
{
    "SecurityGroups": [
        {
            "Description": "My SecurityGroup",
            "GroupName": "mysecgroup2",
            "IpPermissions": [
                {
                    "FromPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "ToPort": 22,
                    "UserIdGroupPairs": []
                }
            ],
            "OwnerId": "281230433728",
            "GroupId": "sg-04b4e7642a8fc6efe",
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "Ipv6Ranges": [],
                    "PrefixListIds": [],
                    "UserIdGroupPairs": []
                }
            ],
            "VpcId": "vpc-04e72e6413b624d29"
        }
    ]
}

EC2インスタンスの作成

いよいよEC2インスタンスを作成します。慣れないと長く感じますね〜

$ aws ec2 run-instances --image-id ami-0ff21806645c5e492 --count 1 --instance-type t2.micro --key-name myawskey-tokyo --security-group-ids sg-04b4e7642a8fc6efe --subnet-id subnet-0b99e52d17314979d

まず、image-idは次のコマンドでimageの一覧を取得することもできますが、どれなのかさっぱりわからなかったので、マネジメントコンソールから取ってきました。

aws ec2 describe-images

あとは、key-nameは普段使っているキーペアの名前です。
pemファイルがあったら、.pemを除いたファイル名で良いかと思います。

もう一つインスタンスを作成しておきます。

$ aws ec2 run-instances --image-id ami-0ff21806645c5e492 --count 1 --instance-type t2.micro --key-name myawskey-tokyo --security-group-ids sg-04b4e7642a8fc6efe --subnet-id subnet-0f2edab09ccc98c0f

これで作成完了です。

やっぱりCLIは慣れると使いやすいし早いです。