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

2023.09.12
AWS CLIとシェルスクリプトでネットワーク作成
この記事をシェアする

こんにちは、ストロークが安定しないiizakaです。(テニスの話)

今回はAWS CLIってあまり触れたことないなとふと思い、試しに使ってみました。
シェルスクリプトにてリソースを作成してみたので、コマンドの構文やオプション、コマンドってどこから調べたらいいのかを紹介します。

私のAWS CLI使用前のイメージ

・コマンド覚えるのが面倒。

・コンソールからサービスいじったほうが早いんじゃないのかね。

しかし、使用してみるとAWS CLIには下記のようなメリットがあると分かりました。

・テキスト化しておけば繰り返し利用することができる。

・コンソール画面で手作業で行っていた操作を自動化出来る。

AWS CLIとは

コマンドにてAWSサービスを管理することができます。

例) 

  • S3にファイルをアップロードする
  • EC2を立ちあげる

など。その他、AWS CLIでのみ実行可能な操作もあります。

アマゾン公式から引用しますと、
コマンド操作でAWSサービスを利用するための統合ツールです。
ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから AWS の複数のサービスを制御し、スクリプトを使用してこれらを自動化することができます。

https://aws.amazon.com/jp/cli/

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を開きます。

IDEを開き、「aws –version」を入力しAWS CLIのバージョンがv2であることを確認します。

AWS Cloud9の一時認証情報(AMTC)について

AWS Cloud9ではAWSサービスへのフルアクセス権限を持つ一時認証情報(AMTC)が設定されています。
※一部制限あり

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

右上の歯車から[AWS SETTINGS]を開いて[AWS managed temporary credentials]をオフにします。

認証情報の登録

「aws configure」コマンドにてアクセスキーID,シークレットアクセスキーIDを登録します。
~/.aws/配下のconfigとcredentialsにて認証情報を確認できます。

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のユーザーガイドより確認できます。
AWS CLI リファレンスは公式ドキュメントより参照できます。

ネットワーク作成

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

リファレンスを開いたらAWS CLI version 2はこちらと案内があるので[here]をクリックします。
左上の[Available Services]をクリックします。
Available Servicesの中から[EC2]をクリックします。
続いてAvailable Commandsの中から[create-vpc]をクリックします。
※VPC作成は[Available Services]からVPCを選ぶのではなく、EC2を選択して作成するのが最初は違和感あった。
[Synopsis]にてサブコマンドとパラメータが確認できます。
AWS Cloud9上でシェルスクリプト(vpc.sh)を作成します。[Synopsis]よりサブコマンドとパラメータをコピーし貼り付けます。この際に頭にaws ec2を付けます。
貼り付けたコマンドを加工していきます。必要なパラメータのみ残し、値を記入します。【】を外し、末尾には改行(バックスラッシュ)を記入します。
加工したコマンドをターミナルに貼り付けます。
コンソールよりVPCが作成されていることを確認します。

同様に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 ※出力形式を指定します。

オプションを利用しコマンドを改良

  1. 各リソースのIDを変数に代入します。パラメータにてIDを指定している箇所を変数に置き換えます。変数に置き換えることにより動的にIDを抽出することができます。
  2. リソース名の接頭辞をPREFIX変数に代入します。
  3. 先ほど作成した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はリソースへの特定の操作を順番に実施する必要がある場合などは、マニュアル化しやすく作業ミスを減らせる。など良い部分も発見できた。目的によって使い分けていきたいです。

この記事をシェアする
著者:iizaka
テニスや登山、ラーメンが好きなAWSエンジニア。 2023 Japan AWS All Certifications Engineers