AWS CLIを使用してVPCを作成する(サブネット、セキュリティグループ等含む)
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環境をセットアップします。
-
VPCの作成: aws ec2 create-vpcコマンドを使用してVPCを作成します。このコマンドはCIDRブロックを引数に取り、作成されたVPCのIPアドレス範囲を指定します。
-
サブネットの作成: aws ec2 create-subnetコマンドを使用して、指定されたVPC内に新しいサブネットを作成します。このコマンドもCIDRブロックを引数に取り、作成されたサブネットのIPアドレス範囲を指定します。
-
インターネットゲートウェイの作成: aws ec2 create-internet-gatewayコマンドを使用して新しいインターネットゲートウェイを作成し、aws ec2 attach-internet-gatewayコマンドを使用してVPCにアタッチします。
-
ルートテーブルの作成: aws ec2 create-route-tableコマンドを使用して、指定されたVPC内に新しいルートテーブルを作成し、aws ec2 associate-route-tableコマンドを使用してサブネットと関連付けます。
-
セキュリティグループの作成: aws ec2 create-security-groupコマンドを使用して、指定されたVPC内に新しいセキュリティグループを作成します。
-
IAMロールとインスタンスプロファイルの作成: aws iam create-roleとaws iam create-instance-profileコマンドを使用してIAMロールとインスタンスプロファイルを作成します。
-
それぞれのコマンドについては、詳細な説明と使用例を含め、別の記事で詳しく解説します。今回のスクリプトは、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