やりたいこと
構成
Ubuntuインスタンス作成
- 無料枠のt2.microでインスタンス作成
IAMロール作成/割り当て
- AWS CLIでVPCリソース作成するための権限を追加
- IAM >> ロール >> ロールの作成
- "信頼されたエンティティ"で"AWSサービス"を選択、"このロールを使用するサービスを選択"でEC2を選択
- "AmazonVPCFullAccess"にチェックを入れて次のステップへ
- 適当なロール名を入れて作成
- 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加工機。以下公式ページより直訳
- curlなどの標準出力をパイプでjqに渡して、抜き出しや加工などができる今回は抜き出しを利用
- jq [オプション] '[抜き出し、加工の定義]'で使う。定義のなかでパイプも使うので通常のパイプとの勘違いに注意