2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS CLI復習◆Cloud9用VPCの構築

Last updated at Posted at 2021-09-12

JAWS-UG CLI専門支部でのハンズオンを参考に、AWS CLIの復習として投稿します。
JAWS-UG CLI専門支部とは?

VPCを作ろう

1.今回の目的

VPCをCLIで作成していくのですが、今回は**「Cloud9環境用のVPC」**を作っていきたいと思います。
Cloud9環境全体イメージを以下としますと、
image.png

緑のVPCの部分、ネットワーク周りをCloudShellからCLIで作成します。
image.png

私のアカウントには現在、タグなしデフォルトVPCと、JAWS-UG CLI専門支部用のハンズオンVPCがあります。
image.png

2.前提条件

以下アクセス権のあるユーザで実施してください。

  • AWSCloudShellFullAccess
  • AmazonVPCFullAccess

また、VPCは各リージョン5つまでというソフトクォータがありますので、既存のVPCが既に5つある場合は1つ以上VPCを削除するか、VPCを作成していない別リージョンに読み替えて実施してください。

3.Cloud9用VPCの構築

JAWS-UG CLI専門支部 以下手順を参考にします。
事前作業1.1. VPCの構築 (CloudShell: handson-cloud9-vpc)

まずはVPCの枠の部分だけ作っていきます。
image.png

AWSマネジメントコンソールのCloudShellアイコンをクリックしてCloudShellを開いていきます。
image.png

ようこそ的な画面は「Close」で閉じます。
image.png

10秒くらい待ちます。
CloudShellが立ち上がってきたら、コマンドを打ち込んでいきます。
image.png

リージョン確認

右上のリージョンメニューから"東京 "を選択しておきます。
(読み替えられる方は別のリージョンでも構いません)

VPCのタグ名

EC2_VPC_TAG_NAMEという変数に、VPCのタグ名を指定します。私はコーヒーが好きなのでcloud9-coffee-vpcとタグ名を付けましょう。

EC2_VPC_TAG_NAME='cloud9-coffee-vpc'

VPCのアドレスレンジ設定

EC2_VPC_CIDRという変数に、VPCのアドレスレンジを指定します。

プライベートIPアドレスってなんだ?という方はこちらへ(@ITのサイトにとびます)

プライベートアドレスの範囲は以下のように決まっています。

  • クラスA:10.0.0.0~10.255.255.255 (10.0.0.0/8)
  • クラスB:172.16.0.0~172.31.255.255 (172.16.0.0/12)
  • クラスC:192.168.0.0~192.168.255.255 (192.168.0.0/16)

この範囲の中から好きなIPアドレスを割り当てればいいのですが、今回はCloud9環境を個人の練習用にたてたいだけなので、深く考えなくてもよいです。
「お仕事で今後IPアドレスがたくさん必要!」とか、「ほかのVPCとかぶらないようにしないといけない!」というときはよく考えてあげてください。
ハンズオンではクラスAとかクラスCとか使いがちな気がするので、今回はクラスBのIPアドレス範囲を指定してみましょう。
172.16.0.0~172.16.255.255(172.16.0.0/16)を設定します。

EC2_VPC_CIDR='172.16.0.0/16'

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_VPC_CIDR:"172.16.0.0/16"
       EC2_VPC_CIDR="${EC2_VPC_CIDR}"

END

出力例

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="ap-northeast-1"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="cloud9-coffee-vpc"
  # 2. EC2_VPC_CIDR:"172.16.0.0/16"
       EC2_VPC_CIDR="172.16.0.0/16"

上下の文字列が同じであれば、変数に正しい値が格納されています。
(ちょっと脱線)ヒアドキュメントとはなんぞや

AWS_REGIONという変数は、環境変数です。最初に選択したリージョン名が自動的に格納されています。
参考(IT用語辞典 e-words様)環境変数 【environment variables】

VPCのタグ文字列設定

EC2_VPC_TAG_NAMEという変数でVPCのタグ名を指定しましたが、次はSTRING_EC2_VPC_TAGという変数にタグ文字列を格納します。
リソースタイプ=vpcと指定します。
また、タグの要素は**「key」「value」**です。keyNamevaluecloud9-coffee-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=cloud9-coffee-vpc}]

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # STRING_EC2_VPC_TAG:"ResourceType=vpc,Tags=[{Key=Name,Value=cloud9-coffee-vpc}]"
    STRING_EC2_VPC_TAG="${STRING_EC2_VPC_TAG}"

END

出力例


  # STRING_EC2_VPC_TAG:"ResourceType=vpc,Tags=[{Key=Name,Value=cloud9-coffee-vpc}]"
    STRING_EC2_VPC_TAG="ResourceType=vpc,Tags=[{Key=Name,Value=cloud9-coffee-vpc}]"

上下の文字列が同じであれば、変数に正しい値が格納されています。

VPC作成

VPCを作成します。

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

出力例

{
    "Vpc": {
        "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
        "InstanceTenancy": "default",
        "Tags": [
            "Value": "cloud9-coffee-vpc",
            "Key": "Name"
        ],
        "CidrBlockAssociationSet": [
            {
                "AssociationId": "vpc-cidr-assoc-xxxxxxxx",
                "CidrBlock": "172.16.0.0/16",
                "CidrBlockState": {
                    "State": "associated"
                }
            }
        ],
        "Ipv6CidrBlockAssociationSet": [],
        "State": "pending",
        "DhcpOptionsId": "dopt-xxxxxxxx",
        "CidrBlock": "vpc-xxxxxxxxxxxxxxxxx",
        "OwnerId": "XXXXXXXXXXXX",
        "IsDefault": false
    }
}
  • aws ec2 create-vpc

    • VPCを作成する
  • --cidr-block

    • VPCのIPアドレス範囲(CIDRブロック)を指定する
  • --tag-specifications

    • VPCにタグ付けする
(ちょっと脱線)VPCを操作するのにCLIコマンドが「aws ec2」?

マネジメントコンソール上のサービスとしては「VPC」と独立していますが、APIとしてはVPCは「EC2」のAPIの中に含まれています。公式リファレンス検索の際には気を付けてください。

マネジメントコンソール CLI(API)
VPC EC2
EC2 EC2

AWS創設(?)当時はVPCというサービスがなく、EC2だけがポンと立てられるようになっていた時代があったそうです(今でいうクラシックEC2というもの、らしい)。EC2サービスがその後拡張してネットワーキングの設定も細かくできるようになって、VPCというサービスに発展したらしく、そのような歴史があってVPCのAPIはEC2のAPIに含まれてしまっているようです。

(脱線ここまで)


VPCが作成できているか確認

では、"cloud9-coffee-vpc"なんてタグ名がついたVPCができているかを確認します。

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

出力例

cloud9-coffee-vpc
  • aws ec2 describe-vpcs
    • VPCの詳細を出力する
  • --filters
    • より具体的なリストを返すためのフィルター名と値のペア。フィルタを使用して、タグ、属性、IDなどの特定の基準によってリソースをフィルタする。
    • Name=tag:Name:フィルタの名前(今回はタグのkeyName
    • Values=${EC2_VPC_TAG_NAME}:フィルタの値(今回はタグのvaluecloud9-coffee-vpc
  • --query 'Vpcs[].Tags[?Key == `Name`].Value'
    • 応答データのフィルタリングに使用するJMESPathクエリ。今回は、VPCの中で、keyNameなものの中でvalue項目だけ出力させる
  • --output text
    • 出力のフォーマットをテキスト文書に指定

filterとqueryの使い分けはまた別にまとめたいと思っているのですが、大まかに以下のような使い分けになるようです。

  • フィルター:出力結果の絞り込み(--filters)
  • クエリー:出力項目の絞り込み(--query)

参考(Developer IO様)AWS CLIのフィルターとクエリーの使い方についてまとめてみた

次に、VPC"cloud9-coffee-vpc"のCIDRが"172.16.0.0/16"であることを確認します。

aws ec2 describe-vpcs \
  --filters Name=tag:Name,Values=${EC2_VPC_TAG_NAME} \
  --query "Vpcs[].CidrBlock" \
  --output text

出力例

172.16.0.0/16
  • --query "Vpcs[].CidrBlock"
  • VPCの中のCidrBlockという項目を表示させる

ここでCloudShellのセッションはいったん切断します。
以後の操作で変数汚染を防ぐため、Ctr+Dで接続を切断します。
再度CloudShellから操作する際はEnterでCloudShellに再接続します。

マネジメントコンソール上でも、新しく「cloud9-coffee-vpc」というタグのついたVPCが作成されているのが確認できます。
※表示されない場合は少し待ってからブラウザをリロードするか、選択しているリージョンが"東京"であることを確認してください。

image.png

4.Cloud9用VPCにアタッチするインターネットゲートウェイの作成

JAWS-UG CLI専門支部 以下手順を参考にします。
事前作業1.2. インターネットゲートウェイの作成 (CloudShell: handson-cloud9-internet-gateway)

インターネットゲートウェイを作成します。
image.png

リージョン確認

右上のリージョンメニューから"東京"を選択しておきます。
VPC作成時に東京以外のリージョンを選択した方は、作成したVPCと同じリージョンにしておいてください。

インターネットゲートウェイのタグ名

EC2_INTERNET_GATEWAY_TAG_NAMEという変数に、インターネットゲートウェイのタグ名を格納します。
私はコーヒーが好きなのでcloud9-coffee-internet-gatewayとタグ名を付けましょう。

EC2_INTERNET_GATEWAY_TAG_NAME='cloud9-coffee-internet-gateway'

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"

  # 1. EC2_INTERNET_GATEWAY_TAG_NAME:"cloud9-coffee-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END

出力例

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="ap-northeast-1"

  # 1. EC2_INTERNET_GATEWAY_TAG_NAME:"cloud9-coffee-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="cloud9-coffee-internet-gateway"

上下の文字列が同じであれば、変数に正しい値が格納されています。
繰り返しますがAWS_REGIONという変数は、環境変数です。

インターネットゲートウェイのタグ文字列設定

次はSTRING_EC2_INTERNET_GATEWAY_TAGという変数にインターネットゲートウェイのタグ文字列を格納します。
リソースタイプ=internet-gatewayと指定します。
また、タグはkeyNamevaluecloud9-coffee-internet-gatewayを格納します。

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=cloud9-coffee-internet-gateway}]

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # STRING_EC2_INTERNET_GATEWAY_TAG:"ResourceType=internet-gateway,Tags=[{Key=Name,Value=cloud9-coffee-internet-gateway}]"
    STRING_EC2_INTERNET_GATEWAY_TAG="${STRING_EC2_INTERNET_GATEWAY_TAG}"

END

出力例

  # STRING_EC2_INTERNET_GATEWAY_TAG:"ResourceType=internet-gateway,Tags=[{Key=Name,Value=cloud9-coffee-internet-gateway}]"
    STRING_EC2_INTERNET_GATEWAY_TAG="ResourceType=internet-gateway,Tags=[{Key=Name,Value=cloud9-coffee-internet-gateway}]"

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

それではインターネットゲートウェイを作成します。

aws ec2 create-internet-gateway \
  --tag-specifications ${STRING_EC2_INTERNET_GATEWAY_TAG}

出力例

{
  "InternetGateway": {
    "Attachments": []
    "InternetGatewayId": "igw-xxxxxxxxxxxxxxxxx",
    "OwnerId": "XXXXXXXXXXXX",
    "Tags": [
        {
            "Key": "Name",
            "Value": "cloud9-coffee-internet-gateway"
        }
  }
}
  • aws ec2 create-internet-gateway
    • インターネットゲートウェイを作成する
  • --tag-specifications
    • タグ名を指定する

インターネットゲートウェイが作成できているか確認

では、"cloud9-coffee-internet-gateway"なんてタグ名がついたインターネットゲートウェイができているかを確認します。

aws ec2 describe-internet-gateways \
  --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME}  \
  --query "InternetGateways[].Tags[].Value" \
  --output text

出力例

cloud9-coffee-internet-gateway

ここでCloudShellのセッションはいったん切断します。
以後の操作で変数汚染を防ぐため、Ctr+Dで接続を切断します。
再度CloudShellから操作する際はEnterでCloudShellに再接続します。

マネジメントコンソール上でも、新しく「cloud9-coffee-internet-gateway」というタグのついたインターネットゲートウェイが作成されているのが確認できます。
※表示されない場合は少し待ってからブラウザをリロードするか、選択しているリージョンが"東京"であることを確認してください。

image.png

5.Cloud9用VPCにインターネットゲートウェイをアタッチする

JAWS-UG CLI専門支部 以下手順を参考にします。
事前作業1.3. インターネットゲートウェイのアタッチ (CloudShell: handson-cloud9-vpc : handson-cloud9-internet-gateway)

インターネットゲートウェイをVPCにアタッチしていきます。
image.png

リージョン確認

右上のリージョンメニューから"東京"を選択しておきます。
VPC作成時に東京以外のリージョンを選択した方は、作成したVPCと同じリージョンにしておいてください。

VPCとインターネットゲートウェイのタグ名

インターネットゲートウェイをVPCにアタッチするために、各タグ名を変数に格納しておきます。
VPCタグ名として、EC2_VPC_TAG_NAMEにはcloud9-coffee-vpcを格納します。
インターネットゲートウェイタグ名として、EC2_INTERNET_GATEWAY_TAG_NAMEにはcloud9-coffee-internet-gatewayを格納します。

EC2_VPC_TAG_NAME='cloud9-coffee-vpc'
EC2_INTERNET_GATEWAY_TAG_NAME='cloud9-coffee-internet-gateway'

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_INTERNET_GATEWAY_TAG_NAME:"cloud9-coffee-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END

出力例

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="ap-northeast-1"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="cloud9-coffee-vpc"
  # 2. EC2_INTERNET_GATEWAY_TAG_NAME:"cloud9-coffee-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="cloud9-coffee-internet-gateway"

上下の文字列が同じであれば、変数に正しい値が格納されています。
AWS_REGIONという変数は、環境変数です。

VPCとインターネットゲートウェイのID取得

インターネットゲートウェイをVPCにアタッチするために、該当のVPCとインターネットゲートウェイのIDが必要になります。そのIDを抽出して変数に格納していきます。

まずVPC IDを取得します。
EC2_VPC_IDという変数に、抽出した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-xxxxxxxxxxxxxxxxx
  • --query 'Vpcs[].VpcId'
    • VPCの中でVpcIdという項目を表示する

VPC IDは実施する環境によって違いますので、vpc-xxxxxxxxxxxxxxxxxとしています。
CloudShell上ではIDの数字が表示されているはずです。

次にインターネットゲートウェイIDを取得します。
EC2_INTERNET_GATEWAY_IDという変数に、抽出したインターネットゲートウェイIDを格納します。

EC2_INTERNET_GATEWAY_ID=$( \
  aws ec2 describe-internet-gateways \
    --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME} \
    --query "InternetGateways[].InternetGatewayId" \
    --output text \
) \
  && echo ${EC2_INTERNET_GATEWAY_ID}

出力例

igw-xxxxxxxxxxxxxxxxx
  • --query "InternetGateways[].InternetGatewayId"
    • インターネットゲートウェイの中でInternetGatewayIdという項目を表示する

インターネットゲートウェイIDは実施する環境によって違いますので、igw-xxxxxxxxxxxxxxxxxとしています。
CloudShell上ではIDの数字が表示されているはずです。

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"
  # EC2_INTERNET_GATEWAY_ID:"igw-xxxxxxxxxxxxxxxxx"
    EC2_INTERNET_GATEWAY_ID="${EC2_INTERNET_GATEWAY_ID}"

END

出力例

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="vpc-xxxxxxxxxxxxxxxxx"
  # EC2_INTERNET_GATEWAY_ID:"igw-xxxxxxxxxxxxxxxxx"
    EC2_INTERNET_GATEWAY_ID="igw-xxxxxxxxxxxxxxxxx"

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

インターネットゲートウェイをVPCにアタッチしていきます。

aws ec2 attach-internet-gateway \
  --vpc-id ${EC2_VPC_ID} \
  --internet-gateway-id ${EC2_INTERNET_GATEWAY_ID}

(出力なし)

  • aws ec2 attach-internet-gateway
    • インターネットゲートウェイをアタッチするコマンド
  • --vpc-id
    • インターネットゲートウェイをアタッチするVPC IDを指定
  • --internet-gateway-id
    • アタッチするインターネットゲートウェイIDを指定

インターネットゲートウェイがVPCにアタッチされているか確認

VPCcloud9-coffee-vpcにインターネットゲートウェイcloud9-coffee-internet-gatewayがアタッチされていることを確認します。

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-xxxxxxxxxxxxxxxxx
  • aws ec2 describe-internet-gateways
    • インターネットゲートウェイの詳細を表示する
  • --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME}
    • 表示したいkeyNamevaluecloud9-coffee-internet-gatewayであるインターネットゲートウェイを検索する
  • --query "InternetGateways[].Attachments[?VpcId == \`${EC2_VPC_ID}\`].VpcId"
    • アタッチされているインターネットゲートウェイの中でVpcIdcloud9-coffee-vpcであるもののVPC IDを表示させる

ここでCloudShellのセッションはいったん切断します。
以後の操作で変数汚染を防ぐため、Ctr+Dで接続を切断します。
再度CloudShellから操作する際はEnterでCloudShellに再接続します。

マネジメントコンソール上でも、「cloud9-coffee-internet-gateway」というタグのついたインターネットゲートウェイが「cloud9-coffee-vpc」というタグのついたVPCにアタッチされているのが確認できます。
※表示されない場合は少し待ってからブラウザをリロードするか、選択しているリージョンが"東京"であることを確認してください。

image.png

6.Cloud9用VPC内のサブネットに紐づけるルートテーブルを作成する

JAWS-UG CLI専門支部 以下手順を参考にします。
事前作業1.4. ルートテーブルの作成 (CloudShell: handson-cloud9-route-table)

ルートテーブルは後ほど中にルーティング情報を設定してサブネットに紐づけます。
まずは空っぽのルートテーブルの枠だけ作成します。
image.png

リージョン確認

右上のリージョンメニューから"東京"を選択しておきます。
VPC作成時に東京以外のリージョンを選択した方は、作成したVPCと同じリージョンにしておいてください。

VPCのタグ名

ルートテーブルを作成する際、ルートテーブルが紐づくサブネットが含まれる(サブネットはこの後作成するのですが)VPCのIDが必要になります。VPC IDを抽出するのにVPCのタグ名が必要になるため、変数にVPCのタグ名を格納しておきます。

EC2_VPC_TAG_NAME='cloud9-coffee-vpc'

ルートテーブルのタグ名

EC2_ROUTE_TABLE_TAG_NAMEという変数に、ルートテーブルのタグ名を指定します。私はコーヒーが好きなのでcloud9-coffee-route-tableとタグ名を付けましょう。

EC2_ROUTE_TABLE_TAG_NAME='cloud9-coffee-route-table'

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"cloud9-coffee-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"

END

出力例

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="ap-northeast-1"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="cloud9-coffee-vpc"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"cloud9-coffee-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="cloud9-coffee-route-table"

上下の文字列が同じであれば、変数に正しい値が格納されています。
AWS_REGIONという変数は、環境変数です。

VPC IDの取得

ルートテーブル作成時、VPC IDが必要になる話を先ほどしました。早速VPC IDを抽出してEC2_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-xxxxxxxxxxxxxxxxx

ルートテーブルのタグ文字列設定

次はSTRING_EC2_ROUTE_TABLE_TAGという変数にルートテーブルのタグ文字列を格納します。
リソースタイプ=route-tableと指定します。
また、タグはkeyNamevaluecloud9-coffee-route-tableを格納します。

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=cloud9-coffee-route-table}]

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="${EC2_VPC_ID}"
  # STRING_EC2_ROUTE_TABLE_TAG:"ResourceType=route-table,Tags=[{Key=Name,Value=cloud9-coffee-route-table}]"
    STRING_EC2_ROUTE_TABLE_TAG="${STRING_EC2_ROUTE_TABLE_TAG}"

END

出力例

  # EC2_VPC_ID:"vpc-xxxxxxxxxxxxxxxxx"
    EC2_VPC_ID="vpc-xxxxxxxxxxxxxxxxx"
  # STRING_EC2_ROUTE_TABLE_TAG:"ResourceType=route-table,Tags=[{Key=Name,Value=cloud9-coffee-route-table}]"
    STRING_EC2_ROUTE_TABLE_TAG="ResourceType=route-table,Tags=[{Key=Name,Value=cloud9-coffee-route-table}]"

ルートテーブル作成

ルートテーブルを作成します。

aws ec2 create-route-table \
  --vpc-id ${EC2_VPC_ID} \
  --tag-specifications ${STRING_EC2_ROUTE_TABLE_TAG}

出力例

{
  "RouteTable": {
    "Associations": [],
    "PropagatingVgws": [],
    "RouteTableId": "rtb-xxxxxxxxxxxxxxxxx",
    "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
    "Tags": [
        {
            "Key": "Name",
            "Value": "cloud9-coffee-route-table"
        }
    ],
    "OwnerId": "XXXXXXXXXXXX",
    "Routes": [
        {
            "GatewayId": "local",
            "DestinationCidrBlock": "172.16.0.0/16",
            "State": "active",
            "Origin": "CreateRouteTable"
        }
    ]
  }
}
  • aws ec2 create-route-table
    • ルートテーブルを作成する
  • --vpc-id
    • VPC IDを指定する
  • --tag-specifications
    • ルートテーブルのタグ名を指定する

ルートテーブルが作成できているか確認

では、"cloud9-coffee-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[].Tags[?Key == \`Name\`].Value" \
  --output text

出力例

handson-cloud9-route-table
  • aws ec2 describe-route-tables
    • ルートテーブルの詳細を表示する
  • --filters Name=vpc-id,Values=${EC2_VPC_ID} \ Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME} \
    • ここで--filterオプションを使ってAND検索しています。
      VPC ID(vpc-id)が"vpc-xxxxxxxxxxxxxxxxx(取得したVPC ID)"かつタグ名が"cloud9-coffee-route-table"のAND検索をしているというわけです。
  • --query "RouteTables[].Tags[?Key == \`Name\`].Value"
    • key=Nameであるタグのvalue値を表示する

ここでCloudShellのセッションはいったん切断します。
以後の操作で変数汚染を防ぐため、Ctr+Dで接続を切断します。
再度CloudShellから操作する際はEnterでCloudShellに再接続します。

マネジメントコンソール上でも、新しく「cloud9-coffee-route-table」というタグのついたルートテーブルが作成されているのが確認できます。
※表示されない場合は少し待ってからブラウザをリロードするか、選択しているリージョンが"東京"であることを確認してください。

image.png

7.ルートテーブルにルート設定する

JAWS-UG CLI専門支部 以下手順を参考にします。
事前作業1.5. ルートの作成 (CloudShell: インターネットゲートウェイ: 0.0.0.0/0)

ルートテーブル"cloud9-coffee-route-table"に、宛先"0.0.0.0/0"へのゲートウェイがインターネットゲートウェイ"cloud9-coffee-internet-gateway"となるルートを作成します。

image.png

リージョン確認

右上のリージョンメニューから"東京"を選択しておきます。
VPC作成時に東京以外のリージョンを選択した方は、作成したVPCと同じリージョンにしておいてください。

VPCとルートテーブルのタグ名

ルートテーブルにルート設定する際、VPC IDとルートテーブルIDとインターネットゲートウェイIDが必要になります。各種IDを抽出するために、タグ名を変数に格納しておきます。

EC2_VPC_TAG_NAME='cloud9-coffee-vpc'
EC2_ROUTE_TABLE_TAG_NAME='cloud9-coffee-route-table'
EC2_INTERNET_GATEWAY_TAG_NAME='cloud9-coffee-internet-gateway'

宛先アドレス(0.0.0.0/0)

宛先アドレス(インターネット向け:0.0.0.0/0)を指定します。
EC2_ROUTE_DESTINATION_CIDRという変数に、IPアドレスCIDR範囲0.0.0.0/0を格納します。

EC2_ROUTE_DESTINATION_CIDR='0.0.0.0/0'

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"cloud9-coffee-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"
  # 3. EC2_ROUTE_DESTINATION_CIDR:"0.0.0.0/0"
       EC2_ROUTE_DESTINATION_CIDR="${EC2_ROUTE_DESTINATION_CIDR}"
  # 4. EC2_INTERNET_GATEWAY_TAG_NAME:"cloud9-coffee-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="${EC2_INTERNET_GATEWAY_TAG_NAME}"

END

出力例

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="ap-northeast-1"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="cloud9-coffee-vpc"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"cloud9-coffee-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="cloud9-coffee-route-table"
  # 3. EC2_ROUTE_DESTINATION_CIDR:"0.0.0.0/0"
       EC2_ROUTE_DESTINATION_CIDR="0.0.0.0/0"
  # 4. EC2_INTERNET_GATEWAY_TAG_NAME:"cloud9-coffee-internet-gateway"
       EC2_INTERNET_GATEWAY_TAG_NAME="cloud9-coffee-internet-gateway"

上下の文字列が同じであれば、変数に正しい値が格納されています。
AWS_REGIONという変数は、環境変数です。

各種IDの取得

VPC IDを取得します。
EC2_VPC_IDという変数に、抽出した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-xxxxxxxxxxxxxxxxx

ルートテーブルIDを取得します。
EC2_ROUTE_TABLE_IDという変数に、抽出したルートテーブルIDを格納します。

EC2_ROUTE_TABLE_ID=$( \
  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_ID}

出力例

rtb-xxxxxxxxxxxxxxxxx
  • aws ec2 describe-route-tables
    • ルートテーブルの詳細を表示する
  • --filters Name=vpc-id,Values=${EC2_VPC_ID} \ Name=tag:Name,Values=${EC2_ROUTE_TABLE_TAG_NAME} \
    • VPC ID(vpc-id)が"vpc-xxxxxxxxxxxxxxxxx(取得したVPC ID)"かつタグ名が"cloud9-coffee-route-table"のAND検索をしている
  • --query "RouteTables[].RouteTableId"
    • ルートテーブルの中のルートテーブルID項目(RouteTableId)を表示する

インターネットゲートウェイIDを取得します。
EC2_INTERNET_GATEWAY_IDという変数に、抽出したインターネットゲートウェイIDを格納します。

EC2_INTERNET_GATEWAY_ID=$( \
  aws ec2 describe-internet-gateways \
    --filters Name=tag:Name,Values=${EC2_INTERNET_GATEWAY_TAG_NAME} \
    --query "InternetGateways[].InternetGatewayId" \
    --output text \
) \
  && echo ${EC2_INTERNET_GATEWAY_ID}

出力例

igw-xxxxxxxxxxxxxxxxx

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # EC2_ROUTE_TABLE_ID:"rtb-xxxxxxxxxxxxxxxxx"
    EC2_ROUTE_TABLE_ID="${EC2_ROUTE_TABLE_ID}"
  # EC2_INTERNET_GATEWAY_ID:"igw-xxxxxxxxxxxxxxxxx"
    EC2_INTERNET_GATEWAY_ID="${EC2_INTERNET_GATEWAY_ID}"

END

出力例

  # EC2_ROUTE_TABLE_ID:"rtb-xxxxxxxxxxxxxxxxx"
    EC2_ROUTE_TABLE_ID="rtb-xxxxxxxxxxxxxxxxx"
  # EC2_INTERNET_GATEWAY_ID:"igw-xxxxxxxxxxxxxxxxx"
    EC2_INTERNET_GATEWAY_ID="igw-xxxxxxxxxxxxxxxxx"

ルートの設定

ではルートテーブルの中にルートを設定していきます。

aws ec2 create-route \
  --route-table-id ${EC2_ROUTE_TABLE_ID} \
  --destination-cidr-block ${EC2_ROUTE_DESTINATION_CIDR} \
  --gateway-id ${EC2_INTERNET_GATEWAY_ID}

出力例

{
  "Return": true
}
  • aws ec2 create-route
    • ルートを作成する
  • --route-table-id
    • ルートを設定するルートテーブルIDを指定する
  • --destination-cidr-block
    • 宛先CIDR範囲を指定する
  • --gateway-id
    • ターゲットとなるゲートウェイIDを指定する。今回はインターネットゲートウェイを指定している

ルートテーブルに設定したルーティング設定があることを確認する

ルートテーブル"cloud9-coffee-route-table"に"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}\`].DestinationCidrBlock" \
  --output text

出力例

0.0.0.0/0
  • --query "RouteTables[].Routes[?DestinationCidrBlock == \`${EC2_ROUTE_DESTINATION_CIDR}\`].DestinationCidrBlock" \
    • ルートテーブルの中の宛先CIDR範囲(DestinationCidrBlock)が、設定したCIDR範囲(0.0.0.0/0)である宛先CIDR範囲項目(DestinationCidrBlock)を表示する

続いてルートテーブル"cloud9-coffee-route-table"の"0.0.0.0/0"へのルートがインターネットゲートウェイ"cloud9-coffee-internet-gateway"に設定されていることを確認します。

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
  • --query "RouteTables[].Routes[?DestinationCidrBlock == \`${EC2_ROUTE_DESTINATION_CIDR}\`].GatewayId" \
    • ルートテーブルの中の宛先CIDR範囲(DestinationCidrBlock)が、設定したCIDR範囲(0.0.0.0/0)であるゲートウェイID項目(GatewayId)を表示する

ここでCloudShellのセッションはいったん切断します。
以後の操作で変数汚染を防ぐため、Ctr+Dで接続を切断します。
再度CloudShellから操作する際はEnterでCloudShellに再接続します。

マネジメントコンソール上でも、ルートテーブル「cloud9-coffee-route-table」のルーティング設定に、送信先が"0.0.0.0/0"、ターゲットが"igw-xxxxxxxxxxxxxxxxx(作成したインターネットゲートウェイのID)"のルートが存在するのが確認できます。
※表示されない場合は少し待ってからブラウザをリロードするか、選択しているリージョンが"東京"であることを確認してください。

image.png

8.Cloud9用VPC内にサブネットを作成する

JAWS-UG CLI専門支部 以下手順を参考にします。
事前作業1.6. サブネットの作成 (CloudShell: public-subnet)

サブネットを作成します。
image.png

リージョン確認

右上のリージョンメニューから"東京"を選択しておきます。
VPC作成時に東京以外のリージョンを選択した方は、作成したVPCと同じリージョンにしておいてください。

VPCのタグ名

サブネットを作成するにはサブネットを作成するVPCのVPC IDが必要になります。VPC IDを抽出するのにVPCのタグ名が必要になるため、変数にVPCのタグ名を格納しておきます。

EC2_VPC_TAG_NAME='cloud9-coffee-vpc'

サブネットのタグ名

EC2_SUBNET_TAG_NAMEという変数に、サブネットのタグ名を指定します。
このサブネットはインターネットへ接続できるパブリックサブネットにする予定です。私はコーヒーが好きなのでcloud9-coffee-public-subnetとタグ名を付けましょう。

EC2_SUBNET_TAG_NAME='cloud9-coffee-public-subnet'

サブネットのアドレスレンジ設定

EC2_SUBNET_CIDRという変数に、サブネットのアドレスレンジを指定します。
現在作成済みのcloud9-coffee-vpcのアドレス範囲は172.16.0.0~172.16.255.255(172.16.0.0/16)です。
サブネットのIPアドレス範囲は、このVPCのアドレス範囲に収まるように設定します。
今回は172.16.0.0~172.16.255.255(172.16.0.0/24)と設定してみましょう。

EC2_SUBNET_CIDR='172.16.0.0/24'

サブネットを配置するAZ名を指定する

EC2_AZ_NAMEという変数に、サブネットを配置するAZ(アベイラビリティゾーン)名を指定します。

東京リージョン(ap-northeast-1)には以下3つのAZがあります。

  • ap-northeast-1a
  • ap-northeast-1c
  • ap-northeast-1d

今回はどこでもいいですが、ap-northeast-1dにしてみましょう。

EC2_AZ_NAME="ap-northeast-1d"

2021年8月7日のAWS亀田さん勉強会「最新サービスをみんなで触ってみる」で聞いたうろ覚えのことですが、一度にたくさんの人がap-northeast-1dを選択しても、ap-northeast-1dAZ内のいろいろなデータセンタに分散されるため、ある程度同時にアクセスしても大丈夫、みたいな感じらしいです。規模が大きいのでしょうかね?

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_SUBNET_TAG_NAME:"cloud9-coffee-public-subnet"
       EC2_SUBNET_TAG_NAME="${EC2_SUBNET_TAG_NAME}"
  # 3. EC2_SUBNET_CIDR:"172.16.0.0/24"
       EC2_SUBNET_CIDR="${EC2_SUBNET_CIDR}"
  # 4. EC2_AZ_NAME:"ap-northeast-1d"
       EC2_AZ_NAME="${EC2_AZ_NAME}"

END

出力例

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="ap-northeast-1"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="cloud9-coffee-vpc"
  # 2. EC2_SUBNET_TAG_NAME:"cloud9-coffee-public-subnet"
       EC2_SUBNET_TAG_NAME="cloud9-coffee-public-subnet"
  # 3. EC2_SUBNET_CIDR:"172.16.0.0/24"
       EC2_SUBNET_CIDR="172.16.0.0/24"
  # 4. EC2_AZ_NAME:"ap-northeast-1d"
       EC2_AZ_NAME="ap-northeast-1d"

上下の文字列が同じであれば、変数に正しい値が格納されています。
AWS_REGIONという変数は、環境変数です。

VPC IDの取得

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-xxxxxxxxxxxxxxxxx

サブネットのタグ文字列設定

次はSTRING_EC2_SUBNET_TAGという変数にサブネットのタグ文字列を格納します。
リソースタイプ=subnetと指定します。
また、タグはkeyNamevaluecloud9-coffee-public-subnetを格納します。

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=cloud9-coffee-public-subnet}]

サブネットの作成

サブネットを作成します。

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": "ap-northeast-1d",
    "AvailabilityZoneId": "<AZ_ID>",
    "AvailableIpAddressCount": 251
    "CidrBlock": "172.16.0.0/24",
    "DefaultForAz": false,
    "MapPublicIpOnLaunch": false,
    "State": "pending",
    "SubnetId": "subnet-xxxxxxxxxxxxxxxxx",
    "VpcId": "vpc-xxxxxxxxxxxxxxxxx",
    "OwnerId": "XXXXXXXXXXXX",
    "AssignIpv6AddressOnCreation": false,
    "Ipv6CidrBlockAssociationSet": [],
    "Tags": [
        {
            "Key": "Name",
            "Value": "cloud9-coffee-public-subnet"
        }
    ],
    "SubnetArn": "arn:aws:ec2:ap-northeast-1:XXXXXXXXXXXX:subnet/subnet-xxxxxxxxxxxxxxxxx"
  }
}
  • aws ec2 create-subnet
    • サブネットを作成する
  • --vpc-id
    • サブネットを作成するVPCのVPC IDを指定する
  • --cidr-block
    • サブネットのCIDR範囲を指定する
  • --availability-zone
    • サブネットを作成するAZ名を指定する
  • --tag-specifications
    • タグ名を指定する

サブネットができているか確認

VPC"cloud9-coffee-vpc"にサブネット"cloud9-coffee-public-subnet"が存在することを確認します。

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

出力例

cloud9-coffee-public-subnet
  • aws ec2 describe-subnets
    • サブネットの詳細を表示する
  •           Name=tag:Name,Values=${EC2_SUBNET_TAG_NAME}```
     - VPC ID(vpc-id)が"vpc-xxxxxxxxxxxxxxxxx(取得したVPC ID)"かつタグ名が"cloud9-coffee-public-subnet"のAND検索
    
  • --query 'Subnets[].Tags[?Key == `Name`].Value'
    • key=Nameであるタグのvalue値を表示する

続いてサブネット"cloud9-coffee-public-subnet"のCIDRは"172.16.0.0/24"であることを確認します。

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

出力例

172.16.0.0/24
  • --query "Subnets[].CidrBlock"
    • サブネットの中のCidrBlockという項目を表示させる

続いて、サブネット"cloud9-coffee-public-subnet"のAZは"ap-northeast-1d"であることを確認します。

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

出力例

ap-northeast-1d
  • --query "Subnets[].AvailabilityZone"
    • サブネットの中のAvailabilityZoneという項目を表示させる

ここでCloudShellのセッションはいったん切断します。
以後の操作で変数汚染を防ぐため、Ctr+Dで接続を切断します。
再度CloudShellから操作する際はEnterでCloudShellに再接続します。

マネジメントコンソール上でも、新しく「cloud9-coffee-public-subnet」というタグのついたサブネットが作成されているのが確認できます。
※表示されない場合は少し待ってからブラウザをリロードするか、選択しているリージョンが"東京"であることを確認してください。

image.png

9.Cloud9用VPC内のサブネットにルートテーブルを紐づける

JAWS-UG CLI専門支部 以下手順を参考にします。
事前作業1.7. ルートテーブルの更新 (CloudShell: public-subnetとの関連付け)

作成したサブネットに、作成したルートテーブルを紐づけます。これでこのサブネットからインターネットへ接続できるようになり、パブリックサブネットと名乗れるようになります。
いよいよコーヒーのいい香りがしてきましたね。
image.png

リージョン確認

右上のリージョンメニューから"東京"を選択しておきます。
VPC作成時に東京以外のリージョンを選択した方は、作成したVPCと同じリージョンにしておいてください。

VPC、ルートテーブル、サブネットのタグ名

各種タグ名を変数に格納します。

EC2_VPC_TAG_NAME='cloud9-coffee-vpc'
EC2_ROUTE_TABLE_TAG_NAME='cloud9-coffee-route-table'
EC2_SUBNET_TAG_NAME='cloud9-coffee-public-subnet'

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="${AWS_REGION}"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="${EC2_VPC_TAG_NAME}"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"cloud9-coffee-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="${EC2_ROUTE_TABLE_TAG_NAME}"
  # 3. EC2_SUBNET_TAG_NAME:"cloud9-coffee-public-subnet"
       EC2_SUBNET_TAG_NAME="${EC2_SUBNET_TAG_NAME}"

END

出力例

  # 0. AWS_REGION:"ap-northeast-1"
       AWS_REGION="ap-northeast-1"
  # 1. EC2_VPC_TAG_NAME:"cloud9-coffee-vpc"
       EC2_VPC_TAG_NAME="cloud9-coffee-vpc"
  # 2. EC2_ROUTE_TABLE_TAG_NAME:"cloud9-coffee-route-table"
       EC2_ROUTE_TABLE_TAG_NAME="cloud9-coffee-route-table"
  # 3. EC2_SUBNET_TAG_NAME:"cloud9-coffee-public-subnet"
       EC2_SUBNET_TAG_NAME="cloud9-coffee-public-subnet"

上下の文字列が同じであれば、変数に正しい値が格納されています。
AWS_REGIONという変数は、環境変数です。

VPC、ルートテーブル、サブネットのID取得

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-xxxxxxxxxxxxxxxxx

ルートテーブルIDを取得します。

EC2_ROUTE_TABLE_ID=$( \
  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_ID}

出力例

rtb-xxxxxxxxxxxxxxxxx

サブネット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-xxxxxxxxxxxxxxxxx

ヒアドキュメントで、変数に値が正しく入っているか確認します。

cat << END

  # EC2_SUBNET_ID:"subnet-xxxxxxxxxxxxxxxxx"
    EC2_SUBNET_ID="${EC2_SUBNET_ID}"
  # EC2_ROUTE_TABLE_ID:"rtb-xxxxxxxxxxxxxxxxx"
    EC2_ROUTE_TABLE_ID="${EC2_ROUTE_TABLE_ID}"

END

出力例

  # EC2_SUBNET_ID:"subnet-xxxxxxxxxxxxxxxxx"
    EC2_SUBNET_ID="subnet-xxxxxxxxxxxxxxxxx"
  # EC2_ROUTE_TABLE_ID:"rtb-xxxxxxxxxxxxxxxxx"
    EC2_ROUTE_TABLE_ID="rtb-xxxxxxxxxxxxxxxxx"

ルートテーブルをサブネットに関連付ける

ルートテーブルとサブネットを関連付けします。

aws ec2 associate-route-table \
  --subnet-id ${EC2_SUBNET_ID} \
  --route-table-id ${EC2_ROUTE_TABLE_ID}

出力例

{
  "AssociationId": "rtbassoc-xxxxxxxxxxxxxxxxx"
  "AssociationState": {
      "State": "associated"
  }
}
  • aws ec2 associate-route-table
    • ルートテーブルをサブネットに関連付ける
  • --subnet-id
    • 関連付けるサブネットのサブネットIDを指定する
  • --route-table-id
    • 関連付けるルートテーブルのルートテーブルIDを指定する

ルートテーブルがサブネットに紐づいたか確認する

ルートテーブル"cloud9-coffee-route-table"がサブネット"cloud9-coffee-public-subnet"と関連付いていることを確認します。

aws ec2 describe-route-tables \
  --route-table-ids ${EC2_ROUTE_TABLE_ID} \
  --query "RouteTables[].Associations[?SubnetId == \`${EC2_SUBNET_ID}\`].RouteTableAssociationId" \
  --output text

出力例

rtbassoc-xxxxxxxxxxxxxxxxxx

ここでCloudShellのセッションはCtr+Dで切断します。

マネジメントコンソール上でも、ルートテーブル"cloud9-coffee-route-table"がサブネット"cloud9-coffee-public-subnet"と関連付いていることが確認できます。
※表示されない場合は少し待ってからブラウザをリロードするか、選択しているリージョンが"東京"であることを確認してください。

image.png

Cloud9環境のためのVPCができました

以上で、Cloud9環境を作成する前準備として、ルートテーブルなども含むVPCの作成が完了しました。

image.png

ここまでで作成したリソースには課金されません。
次回は、Cloud9環境を操作するためのユーザ作成の復習を実施する予定です。

権限周りのイメージ図↓
image.png

参考資料

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?