AWS CLIとシェルスクリプトでネットワーク作成

目次
こんにちは、ストロークが安定しないiizakaです。(テニスの話)
今回はAWS CLIってあまり触れたことないなとふと思い、試しに使ってみました。
シェルスクリプトにてリソースを作成してみたので、コマンドの構文やオプション、コマンドってどこから調べたらいいのかを紹介します。
私のAWS CLI使用前のイメージ
・コマンド覚えるのが面倒。
・コンソールからサービスいじったほうが早いんじゃないのかね。
しかし、使用してみるとAWS CLIには下記のようなメリットがあると分かりました。
・テキスト化しておけば繰り返し利用することができる。
・コンソール画面で手作業で行っていた操作を自動化出来る。
AWS CLIとは
コマンドにてAWSサービスを管理することができます。
例)
- S3にファイルをアップロードする
- EC2を立ちあげる
など。その他、AWS CLIでのみ実行可能な操作もあります。
アマゾン公式から引用しますと、
https://aws.amazon.com/jp/cli/
コマンド操作でAWSサービスを利用するための統合ツールです。
ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから AWS の複数のサービスを制御し、スクリプトを使用してこれらを自動化することができます。
AWS CLIの準備をする
AWS CLIが利用できる環境を確認しましょう。
- Windows,Mac,Linux上で実行できる。
- AmazonLinuxのEC2,Cloud9,Cloud Shellには初めからインストールされている。
ローカルへのインストールは公式ドキュメントを参照しましょう。

今回の検証ではAWS CLIの実行環境としてAWS Cloud9を利用していきます。
下記設定でAWS Cloud9を作成します。
- インスタンスタイプ:t2.micro
- プラットフォーム:Amazon Linux 2
- タイムアウト:30分
- 接続:AWS Systems Manager(SSM)
作成が完了したらIDEを開きます。

AWS Cloud9の一時認証情報(AMTC)について
AWS Cloud9ではAWSサービスへのフルアクセス権限を持つ一時認証情報(AMTC)が設定されています。
※一部制限あり
今回実施した検証ではIAMユーザへフルアクセス権限(AdministratorAccess)を付与しているので、一部制限のある
一時認証情報(AMTC)を削除しaws configureにてIAMユーザのアクセスキーを登録します。

認証情報の登録


AWS CLI コマンドの基本構文
aws <command> <subcommand> [parameters]
<command> 対象とするAWSのサービス
<subcommand> 実行する操作
[parameters] パラメータ
例) VPCを作成するコマンド
aws ec2 create-vpc –cidr-block 10.0.0.0/16
コマンドが分からないとき
慣れないうちはコマンドを調べながら作業することになると思いますが、下記の方法でコマンドを調べることができます。
- コマンドの途中で「Tab」を押すと自動補完されます。
- AWS CLIではhelpを使うとコマンドの続きを参照することができます。
- リファレンスを参照する。これが一番大事。
※公式ドキュメントより確認できます。 - 公式ドキュメントのサンプルを参照する。
※AWS CLIのユーザーガイドより確認できます。

ネットワーク作成
リファレンスを参照しながらネットワークを作成してみましょう。
まずは試しにVPCを作成します。




※VPC作成は[Available Services]からVPCを選ぶのではなく、EC2を選択して作成するのが最初は違和感あった。





同様にInternetGateway,PublicSubnet,RouteTableを作成していきます。

filters/query/outputオプションについて
- filters :出力結果を束で抽出する
例 aws ec2 describe-vpcs –filters Name=cidr,Values=10.0.0.0/16 - query :特定の出力結果を抽出する
例 aws ec2 describe-vpcs –query “Vpcs[*].VpcID” - output :出力形式を指定
— output json/text/table/yaml ※出力形式を指定します。
オプションを利用しコマンドを改良
- 各リソースのIDを変数に代入します。パラメータにてIDを指定している箇所を変数に置き換えます。変数に置き換えることにより動的にIDを抽出することができます。
- リソース名の接頭辞をPREFIX変数に代入します。
- 先ほど作成したVPCは削除し、bashコマンドを使用しシェルスクリプトとして実行してみましょう。


想定しているリソースが全て作られていることが確認できました。
#!/bin/bash
PREFIX="iizaka"
# VPC
aws ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--instance-tenancy default \
--tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=${PREFIX}-vpc}]"
VPC_ID=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values=${PREFIX}-vpc \
--query "Vpcs[*].VpcId" --output text)
# InternetGateway
INTERNET_GATEWAY_ID=$(aws ec2 create-internet-gateway \
--tag-specifications "ResourceType=internet-gateway,Tags=[{Key=Name,Value=${PREFIX}-igw}]" \
--query "InternetGateway.InternetGatewayId" --output text)
aws ec2 attach-internet-gateway \
--internet-gateway-id $INTERNET_GATEWAY_ID \
--vpc-id $VPC_ID
# Public subnet
PUBLIC_SUBNET_1a_ID=$(aws ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block 10.0.11.0/24 \
--availability-zone ap-northeast-1a \
--tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${PREFIX}-public-subnet-1a}]" \
--query "Subnet.SubnetId" --output text)
PUBLIC_SUBNET_1c_ID=$(aws ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block 10.0.12.0/24 \
--availability-zone ap-northeast-1c \
--tag-specifications "ResourceType=subnet,Tags=[{Key=Name,Value=${PREFIX}-public-subnet-1c}]" \
--query "Subnet.SubnetId" --output text)
# Public routeTable
ROUTE_TABLE_ID=$(aws ec2 create-route-table \
--vpc-id $VPC_ID \
--tag-specifications "ResourceType=route-table,Tags=[{Key=Name,Value=${PREFIX}-public-route}]" \
--query "RouteTable.RouteTableId" --output text)
aws ec2 create-route \
--route-table-id $ROUTE_TABLE_ID \
--destination-cidr-block 0.0.0.0/0 \
--gateway-id $INTERNET_GATEWAY_ID
aws ec2 associate-route-table \
--route-table-id $ROUTE_TABLE_ID \
--subnet-id $PUBLIC_SUBNET_1a_ID
aws ec2 associate-route-table \
--route-table-id $ROUTE_TABLE_ID \
--subnet-id $PUBLIC_SUBNET_1c_ID
おわりに
AWS CLIを触れてみて、リソースを作成するだけであれば学習コストなども考えると直感的な操作が可能なマネジメントコンソールで作成してしまうのが早いのではと感じた。
一方でAWS CLIはリソースへの特定の操作を順番に実施する必要がある場合などは、マニュアル化しやすく作業ミスを減らせる。など良い部分も発見できた。目的によって使い分けていきたいです。