🌊

AWS CLIを使用してVPCを作成する(サブネット、セキュリティグループ等含む)

2023/08/05に公開

AWS CLIを使用してVPCを作成する

はじめに

Amazon Web Services (AWS)のコマンドラインインターフェース (CLI)は、AWSリソースの管理を効率的に行うための強力なツールです。今回は、AWS CLIを使ってVPC(Virtual Private Cloud)、サブネット、インターネットゲートウェイ、ルートテーブル、セキュリティグループ、IAMロール、インスタンスプロファイルを作成するスクリプトについて紹介します。

パラメータ

スクリプトを汎用性のあるものにするために、以下のパラメータを変数として定義しました。これらの変数は各コマンドで使用されます。

パラメータ 用途
VPC_NAME VPC、セキュリティグループ、IAMロール、インスタンスプロファイルなどの名前として使用されます。
PUBLIC_SUBNET_A_ID パブリックサブネットAの利用可能ゾーンとして使用されます。
PUBLIC_SUBNET_C_ID パブリックサブネットCの利用可能ゾーンとして使用されます。
PRIVATE_SUBNET_A_ID プライベートサブネットAの利用可能ゾーンとして使用されます。
PRIVATE_SUBNET_C_ID プライベートサブネットCの利用可能ゾーンとして使用されます。
IGW_ID インターネットゲートウェイのIDとして使用されます。
RTB_ID ルートテーブルの名前として使用されます。
SG_NAME セキュリティグループの名前として使用されます。
ROLE_NAME IAMロールとインスタンスプロファイルの名前として使用されます。

スクリプトの説明

このスクリプトでは、以下の手順でAWSのVPC環境をセットアップします。

  1. VPCの作成: aws ec2 create-vpcコマンドを使用してVPCを作成します。このコマンドはCIDRブロックを引数に取り、作成されたVPCのIPアドレス範囲を指定します。

  2. サブネットの作成: aws ec2 create-subnetコマンドを使用して、指定されたVPC内に新しいサブネットを作成します。このコマンドもCIDRブロックを引数に取り、作成されたサブネットのIPアドレス範囲を指定します。

  3. インターネットゲートウェイの作成: aws ec2 create-internet-gatewayコマンドを使用して新しいインターネットゲートウェイを作成し、aws ec2 attach-internet-gatewayコマンドを使用してVPCにアタッチします。

  4. ルートテーブルの作成: aws ec2 create-route-tableコマンドを使用して、指定されたVPC内に新しいルートテーブルを作成し、aws ec2 associate-route-tableコマンドを使用してサブネットと関連付けます。

  5. セキュリティグループの作成: aws ec2 create-security-groupコマンドを使用して、指定されたVPC内に新しいセキュリティグループを作成します。

  6. IAMロールとインスタンスプロファイルの作成: aws iam create-roleとaws iam create-instance-profileコマンドを使用してIAMロールとインスタンスプロファイルを作成します。

  7. それぞれのコマンドについては、詳細な説明と使用例を含め、別の記事で詳しく解説します。今回のスクリプトは、AWSのVPC環境をセットアップするための基本的なフレームワークを提供します。

これらのコマンドの組み合わせにより、AWSの環境を柔軟にカスタマイズし、管理することが可能となります。それぞれのプロジェクトや用途に合わせて、パラメータを変更することで、このスクリプトを再利用することができます。

手順

AWSの仮想プライベートクラウド(VPC)は、AWSクラウド内にプライベートなネットワーク空間を作成するサービスです。この記事では、AWS CLIを使用してVPCとその関連リソースを作成する手順を紹介します。

まず、VPCを作成します。ここでは、CIDRブロック(IPアドレス範囲)を10.0.0.0/16と指定していますが、用途に応じて変更可能です。また、VPCにはタグを設定しており、その名前は変数VPC_NAMEから取得します。

VPC_NAME='aws-example-vpc'

aws ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--tag-specifications "ResourceType=vpc,Tags=[{Key=Name,Value=$VPC_NAME}]" \
--query 'Vpc.VpcId' \
--output text > vpc-id.txt 


VPC_ID=$(<vpc-id.txt)

次に、このVPC内に新しいサブネットを作成します。サブネットはVPC内のIPアドレス範囲を細分化したもので、リソース(EC2インスタンスなど)が配置される領域となります。この例では、公開サブネットと非公開サブネットをそれぞれ2つずつ作成します。

aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1a --cidr-block 10.0.0.0/24 --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value="'${VPC_NAME}'-public-subnet-a"}]' --query 'Subnet.SubnetId' --output text > subnet-a-id.txt

PUBLIC_SUBNET_A_ID=$(<subnet-a-id.txt)

以下のコマンドは、同様に他のサブネットを作成します。

aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1c --cidr-block 10.0.1.0/24 --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value="'${VPC_NAME}'-public-subnet-c"}]' --query 'Subnet.SubnetId' --output text > subnet-c-id.txt

PUBLIC_SUBNET_C_ID=$(<subnet-c-id.txt)

aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1a --cidr-block 10.0.10.0/24 --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value="'${VPC_NAME}'-private-subnet-a"}]' --query 'Subnet.SubnetId' --output text > private-subnet-a-id.txt

PRIVATE_SUBNET_A_ID=$(<private-subnet-a-id.txt)

aws ec2 create-subnet --vpc-id $VPC_ID --availability-zone ap-northeast-1c --cidr-block 10.0.11.0/24 --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value="'${VPC_NAME}'-private-subnet-c"}]' --query 'Subnet.SubnetId' --output text > private-subnet-c-id.txt

PRIVATE_SUBNET_C_ID=$(<private-subnet-c-id.txt)

次に、インターネットゲートウェイを作成し、それをVPCにアタッチします。インターネットゲートウェイは、VPCとインターネットとの間の通信を可能にするためのゲートウェイです。

aws ec2 create-internet-gateway --tag-specifications "ResourceType=internet-gateway,Tags=[{Key=Name,Value=$VPC_NAME-igw}]" --query 'InternetGateway.InternetGatewayId' --output text > igw-id.txt

IGW_ID=$(<igw-id.txt)

aws ec2 attach-internet-gateway --internet-gateway-id $IGW_ID --vpc-id $VPC_ID

次に、ルートテーブルを作成し、それに新しいルートを追加します。ルートテーブルは、サブネットのネットワークトラフィックのルーティングを制御します。また、公開サブネットをルートテーブルに関連付け、インターネットへのルートを追加します。

aws ec2 create-route-table --vpc-id $VPC_ID --tag-specifications "ResourceType=route-table,Tags=[{Key=Name,Value=$VPC_NAME-public-route-table}]" --query 'RouteTable.RouteTableId' --output text > rtb-id.txt

RTB_ID=$(<rtb-id.txt)

aws ec2 create-route --route-table-id $RTB_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $IGW_ID

aws ec2 associate-route-table --subnet-id $SUBNET_A_ID --route-table-id $RTB_ID

aws ec2 associate-route-table --subnet-id $SUBNET_C_ID --route-table-id $RTB_ID

次に、新しいセキュリティグループを作成します。セキュリティグループは、VPC内のインスタンスのトラフィックフローを制御するための仮想ファイアウォールです。

SG_NAME="${VPC_NAME}-sg"

aws ec2 create-security-group --description "Security group for ${SG_NAME}" --group-name "$SG_NAME" --vpc-id "$VPC_ID" --tag-specifications "ResourceType=security-group,Tags=[{Key=Name,Value=$SG_NAME}]"

次に、IAMロールとインスタンスプロファイルを作成します。IAMロールは、AWSサービスに対して特定のアクションを許可するためのものです。インスタンスプロファイルは、EC2インスタンスにIAMロールを関連付けるためのコンテナです。

cat << EOF > ec2-role-trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "ec2.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

aws iam create-role --role-name ${VPC_NAME}-role --assume-role-policy-document file://ec2-role-trust-policy.json

aws iam attach-role-policy --role-name "${VPC_NAME}-role" --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

aws iam create-instance-profile --instance-profile-name ${VPC_NAME}-instance-profile

aws iam add-role-to-instance-profile --instance-profile-name ${VPC_NAME}-instance-profile --role-name ${VPC_NAME}-role

参考文献

Discussion