ばーろぐわにる

SIerからWEB系?インフラエンジニアにジョブチェンジした見習いの備忘録。投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

AWS CLI使ってそれっぽいVPC/サブネット/NATゲートウェイを作る

やりたいこと

  • AWS CLIを使ってVPC/サブネット/NATゲートウェイを作成し、よくありそうなネットワークを作成する
    • Cloud Formation使ったほうがいい気がするけど勉強ということで

構成

 

Ubuntuインスタンス作成

IAMロール作成/割り当て

  • AWS CLIVPCリソース作成するための権限を追加
  • IAM >> ロール >> ロールの作成
  • "信頼されたエンティティ"で"AWSサービス"を選択、"このロールを使用するサービスを選択"でEC2を選択
  • "AmazonVPCFullAccess"にチェックを入れて次のステップへ
    • この権限があると、VPC/サブネットなどが作成できる。インスタンス一覧の確認権限なども入っている。
  • 適当なロール名を入れて作成
  • EC2で先ほど作成したインスタンスを右クリックして"インスタンスの設定" >> "IAM ロールの割り当て/置換"から先ほど作成したロールを割り当て

AWS CLI, jqインストール

  • 各種インストール
    curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
    sudo apt-get install update
    sudo apt-get install python
    sudo apt-get install jq
    sudo python get-pip.py
    sudo pip install awscli
  • aws cli設定。IAMロールをインスタンスに割り当てていためAccessKey/SecretKeyは設定不要
    ubuntu@humidai:~$ aws configure
    AWS Access Key ID [None]: 
    AWS Secret Access Key [None]: 
    Default region name [None]: ap-northeast-1 ※デプロイしたリージョンにあわせる
    Default output format [None]: 設定しない

スクリプト実行

#!/bin/bash
 
# アドレス定義
VPC_ADDR='10.100.0.0/16'
PUBLIC_SUBNET_A01_ADDR='10.100.0.0/24'
PUBLIC_SUBNET_C01_ADDR='10.100.10.0/24'
PRIVATE_SUBNET_A01_ADDR='10.100.50.0/24'
PRIVATE_SUBNET_A02_ADDR='10.100.51.0/24'
PRIVATE_SUBNET_A03_ADDR='10.100.52.0/24'
PRIVATE_SUBNET_C01_ADDR='10.100.60.0/24'
PRIVATE_SUBNET_C02_ADDR='10.100.61.0/24'
PRIVATE_SUBNET_C03_ADDR='10.100.62.0/24'
 
# VPC作成
VPC_ID=$(aws ec2 create-vpc --cidr-block ${VPC_ADDR} | jq -r .Vpc.VpcId)
aws ec2 create-tags --resources $VPC_ID --tags Key=Name,Value="VPC_${VPC_ADDR}"
 
# パブリックサブネット作成
PUBLIC_SUBNET_A01_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1a --cidr-block $PUBLIC_SUBNET_A01_ADDR | jq -r .Subnet.SubnetId)
PUBLIC_SUBNET_C01_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1c --cidr-block $PUBLIC_SUBNET_C01_ADDR | jq -r .Subnet.SubnetId)
aws ec2 create-tags --resources $PUBLIC_SUBNET_A01_ID --tags Key=Name,Value="SUBNET_${PUBLIC_SUBNET_A01_ADDR}"
aws ec2 create-tags --resources $PUBLIC_SUBNET_C01_ID --tags Key=Name,Value="SUBNET_${PUBLIC_SUBNET_C01_ADDR}"
 
# プライベートサブネット作成
PRIVATE_SUBNET_A01_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1a --cidr-block $PRIVATE_SUBNET_A01_ADDR | jq -r .Subnet.SubnetId)
PRIVATE_SUBNET_A02_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1a --cidr-block $PRIVATE_SUBNET_A02_ADDR | jq -r .Subnet.SubnetId)
PRIVATE_SUBNET_A03_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1a --cidr-block $PRIVATE_SUBNET_A03_ADDR | jq -r .Subnet.SubnetId)
PRIVATE_SUBNET_C01_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1c --cidr-block $PRIVATE_SUBNET_C01_ADDR | jq -r .Subnet.SubnetId)
PRIVATE_SUBNET_C02_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1c --cidr-block $PRIVATE_SUBNET_C02_ADDR | jq -r .Subnet.SubnetId)
PRIVATE_SUBNET_C03_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1c --cidr-block $PRIVATE_SUBNET_C03_ADDR | jq -r .Subnet.SubnetId)
aws ec2 create-tags --resources $PRIVATE_SUBNET_A01_ID --tags Key=Name,Value="SUBNET_${PRIVATE_SUBNET_A01_ADDR}"
aws ec2 create-tags --resources $PRIVATE_SUBNET_A02_ID --tags Key=Name,Value="SUBNET_${PRIVATE_SUBNET_A02_ADDR}"
aws ec2 create-tags --resources $PRIVATE_SUBNET_A03_ID --tags Key=Name,Value="SUBNET_${PRIVATE_SUBNET_A03_ADDR}"
aws ec2 create-tags --resources $PRIVATE_SUBNET_C01_ID --tags Key=Name,Value="SUBNET_${PRIVATE_SUBNET_C01_ADDR}"
aws ec2 create-tags --resources $PRIVATE_SUBNET_C02_ID --tags Key=Name,Value="SUBNET_${PRIVATE_SUBNET_C02_ADDR}"
aws ec2 create-tags --resources $PRIVATE_SUBNET_C03_ID --tags Key=Name,Value="SUBNET_${PRIVATE_SUBNET_C03_ADDR}"
 
# インターネットゲートウェイ作成
Internet_GW_ID=$(aws ec2 create-internet-gateway | jq -r .InternetGateway.InternetGatewayId)
aws ec2 create-tags --resources $Internet_GW_ID --tags Key=Name,Value="VPC_${VPC_ADDR}_InternetGW"
 
# VPCにインターネットゲートウェイをアタッチ
aws ec2 attach-internet-gateway --vpc-id $VPC_ID --internet-gateway-id $Internet_GW_ID
 
# EIP発行
EIP_ID=$(aws ec2 allocate-address --domain vpc | jq -r .AllocationId)
aws ec2 create-tags --resources $EIP_ID --tags Key=Name,Value="VPC_${VPC_ADDR}_NATGW_IP"
 
# NATゲートウェイ作成
NAT_GW_01_ID=$(aws ec2 create-nat-gateway --subnet-id $PUBLIC_SUBNET_A01_ID --allocation-id $EIP_ID | jq -r .NatGateway.NatGatewayId)
aws ec2 create-tags --resources $NAT_GW_01_ID --tags Key=Name,Value="VPC_${VPC_ADDR}_NATGW01"
 
# PUBLICサブネット用ルートテーブル作成
PUBLIC_ROUTE_TABLE_01_ID=$(aws ec2 create-route-table --vpc-id $VPC_ID | jq -r .RouteTable.RouteTableId)
aws ec2 create-tags --resources $PUBLIC_ROUTE_TABLE_01_ID --tags Key=Name,Value="VPC_${VPC_ADDR}_PUBLICROUTE_01"
 
# デフォルトルートのゲートウェイをインターネットゲートウェイに設定
aws ec2 create-route --route-table-id $PUBLIC_ROUTE_TABLE_01_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $Internet_GW_ID
 
# PUBLICサブネットで起動したインスタンスに自動でグローバルIPが紐づくように設定
aws ec2 modify-subnet-attribute --subnet-id $PUBLIC_SUBNET_A01_ID --map-public-ip-on-launch
aws ec2 modify-subnet-attribute --subnet-id $PUBLIC_SUBNET_C01_ID --map-public-ip-on-launch
 
# PUBLICサブネット用ルートテーブルをPUBLICサブネットに紐付け
aws ec2 associate-route-table  --subnet-id $PUBLIC_SUBNET_A01_ID --route-table-id $PUBLIC_ROUTE_TABLE_01_ID
aws ec2 associate-route-table  --subnet-id $PUBLIC_SUBNET_C01_ID --route-table-id $PUBLIC_ROUTE_TABLE_01_ID
 
# PRIVATEサブネット用ルートテーブル作成
PRIVATE_ROUTE_TABLE_01_ID=$(aws ec2 create-route-table --vpc-id $VPC_ID | jq -r .RouteTable.RouteTableId)
aws ec2 create-tags --resources $PRIVATE_ROUTE_TABLE_01_ID --tags Key=Name,Value="VPC_${VPC_ADDR}_PRIVATEROUTE_01"
 
# デフォルトルートのゲートウェイをインターネットゲートウェイに設定
aws ec2 create-route --route-table-id $PRIVATE_ROUTE_TABLE_01_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $NAT_GW_01_ID
 
# PRIVATEサブネット用ルートテーブルをPRIVATEサブネットに紐付け
aws ec2 associate-route-table  --subnet-id $PRIVATE_SUBNET_A01_ID --route-table-id $PRIVATE_ROUTE_TABLE_01_ID
aws ec2 associate-route-table  --subnet-id $PRIVATE_SUBNET_A02_ID --route-table-id $PRIVATE_ROUTE_TABLE_01_ID
aws ec2 associate-route-table  --subnet-id $PRIVATE_SUBNET_A03_ID --route-table-id $PRIVATE_ROUTE_TABLE_01_ID
aws ec2 associate-route-table  --subnet-id $PRIVATE_SUBNET_C01_ID --route-table-id $PRIVATE_ROUTE_TABLE_01_ID
aws ec2 associate-route-table  --subnet-id $PRIVATE_SUBNET_C02_ID --route-table-id $PRIVATE_ROUTE_TABLE_01_ID
aws ec2 associate-route-table  --subnet-id $PRIVATE_SUBNET_C03_ID --route-table-id $PRIVATE_ROUTE_TABLE_01_ID

 

感想

  • NATGW作成に時間がかかることがあり、たまにプライベートルートテーブルのデフォルトルート追加に失敗する
    • 正しく使うならエラー処理を検討
  • プライベートサブネットに仮想マシンを立てた場合、グローバルからはアクセス不可能なのでパブリックサブネットに踏み台サーバを立ててそこからアクセス
    • AZが違うと基本的には接続性がないため、VPCピア接続の利用などを検討

memo: jqの使い方

  • jqは軽量で柔軟性の高いコマンドラインJSON加工機。以下公式ページより直訳
    • "jq is a lightweight and flexible command-line JSON processor."
  • curlなどの標準出力をパイプでjqに渡して、抜き出しや加工などができる今回は抜き出しを利用
  • jq [オプション] '[抜き出し、加工の定義]'で使う。定義のなかでパイプも使うので通常のパイプとの勘違いに注意

参考文献