AWS CLI を使用した Amazon VPC の開始方法
このチュートリアルでは、AWS コマンドラインインターフェイス (AWS CLI) を使用して仮想プライベートクラウド (VPC) を作成する方法について説明します。パブリックサブネットとプライベートサブネットを使用して VPC をセットアップする方法、インターネット接続を設定する方法、EC2 インスタンスをデプロイして一般的なウェブアプリケーションアーキテクチャをデモンストレーションする方法について説明します。
前提条件
このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
-
。AWS CLIインストールする必要がある場合は、「AWS CLI の最新バージョンのインストールまたは更新」に従ってください。
-
AWS CLI が適切な認証情報で設定されている。認証情報をまだ設定していない場合は、
aws configure
を実行します。 -
ネットワーク概念の基本的な理解。
-
AWS アカウントで VPC リソースを作成および管理するための Amazon VPC の Identity and Access Management。
コストに関する考慮事項
このチュートリアルでは、アカウントでコストが発生する可能性のある AWS リソースを作成します。主なコストは、NAT ゲートウェイ (1 時間あたり 0.045 USD とデータ処理料金) と EC2 インスタンス (t2.micro、それぞれ 1 時間あたり約 0.0116 USD) です。このチュートリアルを 1 時間以内に完了し、すべてのリソースをクリーンアップすると、合計コストは約 0.07 USD になります。開発環境でコストを最適化するには、NAT ゲートウェイの代わりに NAT インスタンスを使用することを検討してください。これにより、コストを大幅に削減できます。
次に進む前に AWS CLI が正しく設定されていることを確認します。
aws configure list
AWS アクセスキー、シークレットキー、デフォルトリージョンが表示されます。また、VPC リソースを作成するために必要なアクセス許可があることを確認します。
aws sts get-caller-identity
このコマンドは、AWS アカウント ID、ユーザー ID、ARN を表示し、認証情報が有効であることを確認します。
「VPC を作成する」
仮想プライベートクラウド (VPC) は、AWS アカウント専用の仮想ネットワークです。このセクションでは、CIDR ブロックが 10.0.0.0/16 の VPC を作成します。これにより、最大 65,536 個の IP アドレスが提供されます。
VPC を作成する
次のコマンドは、新しい VPC を作成し、名前タグを割り当てます。
aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=MyVPC}]'
出力の VPC ID を書き留めます。これは後続のコマンドで必要になります。このチュートリアルでは、VPC ID の例として「vpc-0123456789abcdef0」を使用します。すべてのコマンドでこれを実際の VPC ID に置き換えます。
DNS サポートとホスト名を有効にする
デフォルトでは、DNS 解決と DNS ホスト名は新しい VPC では無効になっています。これらの機能を有効にして、VPC 内のインスタンスがドメイン名を解決できるようにします。
aws ec2 modify-vpc-attribute --vpc-id vpc-0123456789abcdef0 --enable-dns-support aws ec2 modify-vpc-attribute --vpc-id vpc-0123456789abcdef0 --enable-dns-hostnames
これらのコマンドは、成功した場合に出力を生成しません。VPC で DNS サポートとホスト名解決が有効になりました。
サブネットを作成する
サブネットは、分離されたリソースのグループを配置できる VPC の IP アドレス範囲のセグメントです。このセクションでは、高可用性を実現するために、2 つのアベイラビリティーゾーンにパブリックサブネットとプライベートサブネットを作成します。
利用可能なアベイラビリティーゾーンを取得する
まず、リージョンで使用可能なアベイラビリティーゾーンを取得します。
aws ec2 describe-availability-zones
このチュートリアルでは、最初の 2 つのアベイラビリティーゾーンを使用します。出力からその名前 (例:「us-east-1a」および「us-east-1b」) を書き留めます。
パブリックサブネットを作成する
パブリックサブネットは、ウェブサーバーなど、インターネットからアクセスする必要があるリソースに使用されます。
aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.0.0/24 \ --availability-zone us-east-1a \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Public-Subnet-AZ1}]'
出力のサブネット ID を書き留めます。このチュートリアルでは、最初のパブリックサブネットの例として「subnet-0123456789abcdef0」を使用します。
aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.1.0/24 \ --availability-zone us-east-1b \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Public-Subnet-AZ2}]'
出力のサブネット ID を書き留めます。このチュートリアルでは、2 番目のパブリックサブネットの例として「subnet-0123456789abcdef1」を使用します。
プライベートサブネットの作成
プライベートサブネットは、データベースなど、インターネットから直接アクセスできないリソースに使用されます。
aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.2.0/24 \ --availability-zone us-east-1a \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Private-Subnet-AZ1}]'
出力のサブネット ID を書き留めます。このチュートリアルでは、最初のプライベートサブネットの例として「subnet-0123456789abcdef2」を使用します。
aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.3.0/24 \ --availability-zone us-east-1b \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Private-Subnet-AZ2}]'
出力のサブネット ID を書き留めます。このチュートリアルでは、2 番目のプライベートサブネットの例として「subnet-0123456789abcdef3」を使用します。
これで、2 つのアベイラビリティーゾーンに分散された 2 つのパブリックサブネットと 2 つのプライベートサブネットの 4 つのサブネットができました。
ヒント: CIDR ブロックを計画する際は、既存のネットワークと重複しないようにしてください。本番環境では、セキュリティと管理のためにサブネットを適切なサイズに保ちながら、将来の成長に備えて十分な IP アドレスを割り当てます。
インターネット接続を設定する
VPC 内のリソースがインターネットと通信できるようにするには、インターネットゲートウェイを作成してアタッチする必要があります。このセクションでは、VPC のインターネット接続を設定します。
インターネットゲートウェイを作成する
インターネットゲートウェイは、VPC とインターネット間の通信を可能にします。
aws ec2 create-internet-gateway \ --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=MyIGW}]'
出力からインターネットゲートウェイ ID を書き留めます。このチュートリアルでは、例として「igw-0123456789abcdef0」を使用します。
VPC にインターネットゲートウェイをアタッチする
インターネットゲートウェイを作成後、それを VPC にアタッチします。
aws ec2 attach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0
ルートテーブルを作成および設定する
ルートテーブルには、ネットワークトラフィックの転送先を決定するルール (ルート) が含まれています。まず、パブリックサブネットのルートテーブルを作成します。
aws ec2 create-route-table \ --vpc-id vpc-0123456789abcdef0 \ --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=Public-RT}]'
出力のルートテーブル ID を書き留めます。このチュートリアルでは、パブリックルートテーブルの例として「rtb-0123456789abcdef0」を使用します。
パブリックルートテーブルでインターネットゲートウェイにルートを追加します。
aws ec2 create-route --route-table-id rtb-0123456789abcdef0 --destination-cidr-block 0.0.0.0/0 --gateway-id igw-0123456789abcdef0
パブリックサブネットをパブリックルートテーブルに関連付けます。
aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef0 --subnet-id subnet-0123456789abcdef0 aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef0 --subnet-id subnet-0123456789abcdef1
次に、プライベートサブネットのルートテーブルを作成します。
aws ec2 create-route-table \ --vpc-id vpc-0123456789abcdef0 \ --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=Private-RT}]'
出力のルートテーブル ID を書き留めます。このチュートリアルでは、プライベートルートテーブルの例として「rtb-0123456789abcdef1」を使用します。
プライベートサブネットをプライベートルートテーブルに関連付けます。
aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef1 --subnet-id subnet-0123456789abcdef2 aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef1 --subnet-id subnet-0123456789abcdef3
NAT ゲートウェイを作成する
NAT ゲートウェイを使用すると、プライベートサブネットのインスタンスは、インターネットからのインバウンドトラフィックを防ぎながら、インターネットへのアウトバウンドトラフィックを開始できます。これは、更新をダウンロードしたり、外部サービスにアクセスしたりする必要があるインスタンスに不可欠です。
Elastic IP を割り当てる
まず、NAT ゲートウェイ用の Elastic IP アドレスを割り当てます。
aws ec2 allocate-address --domain vpc
出力の割り当て ID を書き留めます。このチュートリアルでは、例として「eipalloc-0123456789abcdef0」を使用します。
NAT ゲートウェイを作成する
割り当てられた Elastic IP を使用して、いずれかのパブリックサブネットに NAT ゲートウェイを作成します。
aws ec2 create-nat-gateway \ --subnet-id subnet-0123456789abcdef0 \ --allocation-id eipalloc-0123456789abcdef0 \ --tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=MyNATGateway}]'
出力の NAT ゲートウェイ ID を書き留めます。このチュートリアルでは、例として「nat-0123456789abcdef0」を使用します。
NAT ゲートウェイが使用可能になるまで待ってから次に進みます。
aws ec2 wait nat-gateway-available --nat-gateway-ids nat-0123456789abcdef0
NAT ゲートウェイにルートを追加する
プライベートルートテーブルの NAT ゲートウェイにルートを追加して、プライベートサブネットのインスタンスがインターネットにアクセスできるようにします。
aws ec2 create-route --route-table-id rtb-0123456789abcdef1 --destination-cidr-block 0.0.0.0/0 --nat-gateway-id nat-0123456789abcdef0
注: 本番環境では、単一障害点を排除するために、プライベートサブネットがある各アベイラビリティーゾーンに NAT ゲートウェイを作成することを検討してください。
サブネット設定を構成する
パブリックサブネットを設定して、その中で起動されたインスタンスにパブリック IP アドレスが自動的に割り当てられるようにします。
aws ec2 modify-subnet-attribute --subnet-id subnet-0123456789abcdef0 --map-public-ip-on-launch aws ec2 modify-subnet-attribute --subnet-id subnet-0123456789abcdef1 --map-public-ip-on-launch
これにより、パブリックサブネットで起動されたインスタンスがデフォルトでパブリック IP アドレスを受信し、インターネットからアクセスできるようになります。
セキュリティグループを作成する
セキュリティグループは、インスタンスの仮想ファイアウォールとして機能し、インバウンドトラフィックとアウトバウンドトラフィックを制御します。このセクションでは、ウェブサーバーとデータベースサーバーのセキュリティグループを作成します。
ウェブサーバーのセキュリティグループを作成する
aws ec2 create-security-group \ --group-name WebServerSG \ --description "Security group for web servers" \ --vpc-id vpc-0123456789abcdef0
出力のセキュリティグループ ID を書き留めます。このチュートリアルでは、ウェブサーバーセキュリティグループの例として「sg-0123456789abcdef0」を使用します。
ウェブサーバーへの HTTP および HTTPS トラフィックを許可します。
aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef0 --protocol tcp --port 80 --cidr 0.0.0.0/0 aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef0 --protocol tcp --port 443 --cidr 0.0.0.0/0
注: 本番環境では、0.0.0.0/0 (任意の IP アドレス) からのトラフィックを許可するのではなく、インバウンドトラフィックを特定の IP 範囲に制限します。
データベースサーバーのセキュリティグループを作成する
aws ec2 create-security-group \ --group-name DBServerSG \ --description "Security group for database servers" \ --vpc-id vpc-0123456789abcdef0
出力のセキュリティグループ ID を書き留めます。このチュートリアルでは、データベースサーバーセキュリティグループの例として「sg-0123456789abcdef1」を使用します。
ウェブサーバーからの MySQL/Aurora トラフィックのみを許可します。
aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef1 --protocol tcp --port 3306 --source-group sg-0123456789abcdef0
この設定により、最小特権の原則に従って、ウェブサーバーセキュリティグループ内のインスタンスのみがポート 3306 のデータベースサーバーに接続できるようになります。
VPC 設定を検証する
必要なコンポーネントをすべて作成したら、VPC 設定を確認して、すべてが正しく設定されていることを確認します。
VPC を確認する
aws ec2 describe-vpcs --vpc-id vpc-0123456789abcdef0
サブネットを確認する
aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"
ルートテーブルを確認する
aws ec2 describe-route-tables --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"
インターネットゲートウェイを確認する
aws ec2 describe-internet-gateways --filters "Name=attachment.vpc-id,Values=vpc-0123456789abcdef0"
NAT ゲートウェイを確認する
aws ec2 describe-nat-gateways --filter "Name=vpc-id,Values=vpc-0123456789abcdef0"
セキュリティグループを確認する
aws ec2 describe-security-groups --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"
これらのコマンドは、VPC の各コンポーネントに関する詳細情報を提供し、すべてが正しく設定されていることを確認できます。
EC2 インスタンスをデプロイする
VPC インフラストラクチャを作成したので、EC2 インスタンスをデプロイしてアーキテクチャの仕組みをデモンストレーションできます。パブリックサブネットでウェブサーバーを起動し、プライベートサブネットでデータベースサーバーを起動します。
SSH アクセス用のキーペアを作成する
まず、キーペアを作成してインスタンスに安全に接続します。
aws ec2 create-key-pair --key-name vpc-tutorial-key --query 'KeyMaterial' --output text > vpc-tutorial-key.pem chmod 400 vpc-tutorial-key.pem
このコマンドは、新しいキーペアを作成し、アクセス許可が制限されたファイルにプライベートキーを保存します。
最新の Amazon Linux 2 AMI を見つける
インスタンスに使用する最新の Amazon Linux 2 AMI を見つけます。
aws ec2 describe-images --owners amazon \ --filters "Name=name,Values=amzn2-ami-hvm-*-x86_64-gp2" "Name=state,Values=available" \ --query "sort_by(Images, &CreationDate)[-1].ImageId" --output text
出力の AMI ID を書き留めます。このチュートリアルでは、例として「ami-0123456789abcdef0」を使用します。
パブリックサブネットでウェブサーバーを起動する
次に、パブリックサブネットで EC2 インスタンスを起動してウェブサーバーとして機能させます。
aws ec2 run-instances \ --image-id ami-0123456789abcdef0 \ --count 1 \ --instance-type t2.micro \ --key-name vpc-tutorial-key \ --security-group-ids sg-0123456789abcdef0 \ --subnet-id subnet-0123456789abcdef0 \ --associate-public-ip-address \ --user-data '#!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo "<h1>Hello from $(hostname -f)</h1>" > /var/www/html/index.html' \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WebServer}]'
出力のインスタンス ID を書き留めます。このチュートリアルでは、ウェブサーバーインスタンスの例として「i-0123456789abcdef0」を使用します。
プライベートサブネットでデータベースサーバーを起動する
次に、プライベートサブネットで EC2 インスタンスを起動して、データベースサーバーとして機能させます。
aws ec2 run-instances \ --image-id ami-0123456789abcdef0 \ --count 1 \ --instance-type t2.micro \ --key-name vpc-tutorial-key \ --security-group-ids sg-0123456789abcdef1 \ --subnet-id subnet-0123456789abcdef2 \ --user-data '#!/bin/bash yum update -y yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb' \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=DBServer}]'
出力のインスタンス ID を書き留めます。このチュートリアルでは、データベースサーバーインスタンスの例として「i-0123456789abcdef1」を使用します。
ウェブサーバーにアクセスする
ウェブサーバーインスタンスが実行されたら、パブリック IP アドレスを使用してそのインスタンスにアクセスできます。
aws ec2 describe-instances \ --instance-ids i-0123456789abcdef0 \ --query 'Reservations[0].Instances[0].PublicIpAddress' \ --output text
このコマンドは、ウェブサーバーのパブリック IP アドレスを出力します。このチュートリアルでは、例として「203.0.113.10」を使用します。
ウェブブラウザでこの URL を開くことができるようになりました: http://203.0.113.10
SSH 経由でインスタンスに接続する
ウェブサーバーに接続するには:
ssh -i vpc-tutorial-key.pem ec2-user@203.0.113.10
データベースサーバーに接続するには、まずウェブサーバーに SSH 接続し、次にデータベースサーバーに SSH 接続する必要があります。
# Get the private IP of the database server aws ec2 describe-instances \ --instance-ids i-0123456789abcdef1 \ --query 'Reservations[0].Instances[0].PrivateIpAddress' \ --output text
このコマンドは、データベースサーバーのプライベート IP アドレスを出力します。このチュートリアルでは、例として「10.0.2.10」を使用します。
# First SSH to web server, then to database server ssh -i vpc-tutorial-key.pem -A ec2-user@203.0.113.10 ssh ec2-user@10.0.2.10
これは、作成したネットワークアーキテクチャを示しています。ウェブサーバーにはパブリックにアクセスでき、データベースサーバーには VPC 内からのみアクセスできます。
トラブルシューティング
VPC の作成時に発生する可能性がある一般的な問題とその解決方法は以下のとおりです。
CIDR ブロックの重複
CIDR ブロックの重複に関するエラーが表示された場合は、VPC とサブネットの CIDR ブロックがアカウント内の既存の VPC またはサブネットと重複していないことを確認してください。
アクセス許可エラー
アクセス許可エラーが発生した場合は、IAM ユーザーまたはロールに VPC リソースを作成および管理するために必要なアクセス許可があることを確認してください。AmazonVPCFullAccess
ポリシーをアタッチするか、必要なアクセス許可を持つカスタムポリシーを作成する必要があります。
リソースの制限
AWS アカウントには、作成できる VPC、サブネット、その他のリソースの数に対するデフォルトの制限があります。これらの制限に達した場合は、AWS サポートセンターを通じて引き上げをリクエストできます。
クリーンアップ中の依存関係の障害
リソースをクリーンアップする際、間違った順序でリソースを削除しようとすると、依存関係エラーが発生する可能性があります。最も依存しているリソースから始めて、常に作成と逆の順序でリソースを削除します。
リソースをクリーンアップする
VPC の使用が終了したら、料金が発生しないようにリソースをクリーンアップできます。依存関係を正しく処理するには、作成と逆の順序でリソースを削除します。
EC2 インスタンスを終了する
aws ec2 terminate-instances --instance-ids i-0123456789abcdef0 i-0123456789abcdef1 aws ec2 wait instance-terminated --instance-ids i-0123456789abcdef0 i-0123456789abcdef1
キーペアを削除する
aws ec2 delete-key-pair --key-name vpc-tutorial-key rm vpc-tutorial-key.pem
NAT ゲートウェイを削除する
aws ec2 delete-nat-gateway --nat-gateway-id nat-0123456789abcdef0 aws ec2 wait nat-gateway-deleted --nat-gateway-ids nat-0123456789abcdef0
Elastic IP を解放する
aws ec2 release-address --allocation-id eipalloc-0123456789abcdef0
セキュリティグループを削除する
aws ec2 delete-security-group --group-id sg-0123456789abcdef1 aws ec2 delete-security-group --group-id sg-0123456789abcdef0
ルートテーブルを削除する
まず、ルートテーブルの関連付け ID を見つけます。
aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef0 aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef1
次に、サブネットからルートテーブルの関連付けを解除します (関連付け ID を出力の関連付け ID に置き換えます)。
aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef0 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef1 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef2 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef3
次に、ルートテーブルを削除します。
aws ec2 delete-route-table --route-table-id rtb-0123456789abcdef1 aws ec2 delete-route-table --route-table-id rtb-0123456789abcdef0
インターネットゲートウェイをデタッチおよび削除する
aws ec2 detach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0 aws ec2 delete-internet-gateway --internet-gateway-id igw-0123456789abcdef0
サブネットを削除する
aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef0 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef1 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef2 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef3
VPC を削除する
aws ec2 delete-vpc --vpc-id vpc-0123456789abcdef0
本番環境への移行
このチュートリアルは、AWS CLI を使用して VPC を作成する方法を学習できるように設計されています。本番環境では、次のセキュリティとアーキテクチャのベストプラクティスを検討してください。
-
セキュリティグループルール: 0.0.0.0/0 からのトラフィックを許可するのではなく、インバウンドトラフィックを特定の IP 範囲に制限します。
-
高可用性: プライベートサブネットがある各アベイラビリティーゾーンに NAT ゲートウェイをデプロイして、単一障害点を排除します。
-
ネットワーク ACL: セキュリティグループを超えたセキュリティの追加レイヤーとしてネットワーク ACL を実装します。
-
VPC フローログ: VPC フローログを有効にして、ネットワークトラフィックパターンをモニタリングおよび分析します。
-
リソースタグ付け: リソース管理を改善するための包括的なタグ付け戦略を実装します。
本番環境に対応したアーキテクチャの構築の詳細については、「AWS Well-Architected フレームワーク」と「AWS セキュリティ、アイデンティティ、コンプライアンスに関するベストプラクティス
次のステップ
パブリックサブネットとプライベートサブネットを持つ VPC を作成したので、次のことができます。
-
パブリックサブネットまたはプライベートサブネットで EC2 インスタンスを起動する。
-
ロードバランサーをデプロイして、複数のインスタンスにトラフィックを分散する。
-
高可用性とスケーラビリティのために Auto Scaling グループを設定する。
-
プライベートサブネットで RDS データベースを設定する。
-
VPC ピアリングを実装して、他の VPC に接続する。
-
VPN 接続を設定して、VPC をオンプレミスネットワークに接続する。