はじめに
AWS Hands-on for Beginners でハンズオンしてみたものをアウトプットする資料として記事にまとめました。
【Network編#1】AWS上にセキュアなプライベートネットワーク空間を作成する
構成図
VPCEndpointのGateway型とInterface型を構築し、SSMとS3に接続を試すシンプルな構成図です。
ハンズオンの流れ
ハンズオンのざっくりとした全体の流れは、以下の通りです。
①WEBインスタンスを構築し、SSM接続を許可するIAMロールを付与します。
②SSM接続の確認をします。
③Internalインスタンスを立て、SSM接続を許可するIAMロールを付与します。
④ルートテーブルを編集し、NATゲートウェイ経由でプライベートサブネット内からSSMへ接続をします。
★Private Route Table
送信先 | ターゲット |
---|---|
10.0.0.0/16 | local |
0.0.0.0/0 | nat-gateway |
⑤ルートテーブルを編集し、Internal→SSM接続ができない状態にします。
★Private Route Table
送信先 | ターゲット |
---|---|
10.0.0.0/16 | local |
⑥VPCEndpointをInterface型で作り、Internal→SSMへ接続します。
⑦S3バケットを作成します。
⑨ルートテーブルを編集します。
★Private Route Table
送信先 | ターゲット |
---|---|
10.0.0.0/16 | local |
S3 | vpce-xxxx |
⑩InternalのSSMから、aws s3 ls --region ap-northeast-1
で出力を確認します。
IAMロールには以下のポリシーを付与します。
- AmazonS3ReadOnlyAccess
- AmazonSSMFullAccess
- AmazonSSMManagedInstanceCore(※)
※ハンズオン動画では紹介ありませんでしたが、こちらを付与していないとSSMの接続ができませんでした。
Hands-onメモ
AWS CLIで構築したので、メモとして構築手順を記載します。
- VPCの作成、EC2の作成のCLI構築手順については、
以前の記事【AWS CLIでスケーラブルウェブサイトを構築する】を参照ください。 - 以前の記事に記載のないCLI手順については、以下に記載します。
EIPの割り当て
aws ec2 allocate-address
出力は以下になります。
{
"PublicIp": "xx.xx.xx.xx",
"AllocationId": "eipalloc-xxxx",
"PublicIpv4Pool": "amazon",
"NetworkBorderGroup": "ap-northeast-1",
"Domain": "vpc"
}
AllocationId
を、NATゲートウェイ作成時に指定します。
NATゲートウェイの作成
aws ec2 create-nat-gateway \
--allocation-id eipalloc-xxxx \
--subnet-id subnet-xxxx \
--tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=Handson-B}]' \
--output json
EIPの付与、サブネットIDの指定、タグの割り当て、出力結果の指定をします。
出力は以下になります。
{
"ClientToken": "xxxx-xxxx-xxxx-xxxx-xxxx",
"NatGateway": {
"CreateTime": "2023-08-xxT04:48:28+00:00",
"NatGatewayAddresses": [
{
"AllocationId": "eipalloc-xxxx",
"IsPrimary": true,
"Status": "associating"
}
],
"NatGatewayId": "nat-xxxx",
"State": "pending",
"SubnetId": "subnet-xxxx",
"VpcId": "vpc-xxxx",
"Tags": [
{
"Key": "Name",
"Value": "Handson-B"
}
],
"ConnectivityType": "public"
}
}
VPCエンドポイントの作成
aws ec2 create-vpc-endpoint \
--vpc-endpoint-type Interface \
--vpc-id vpc-xxxx \
--subnet-ids subnet-xxxx \
--security-group-ids sg-xxxx \
--service-name com.amazonaws.ap-northeast-1.ssm
出力は以下のようになります。
{
"VpcEndpoint": {
"VpcEndpointId": "vpce-xxxx",
"VpcEndpointType": "Interface",
"VpcId": "vpc-xxxx",
"ServiceName": "com.amazonaws.ap-northeast-1.ssm",
"State": "pending",
"RouteTableIds": [],
"SubnetIds": [
"subnet-xxxx"
],
"Groups": [
{
"GroupId": "sg-xxxx",
"GroupName": "Handson-B-ssm"
}
],
"IpAddressType": "ipv4",
"DnsOptions": {
"DnsRecordIpType": "ipv4"
},
"PrivateDnsEnabled": true,
"RequesterManaged": false,
"NetworkInterfaceIds": [
"eni-xxxx"
],
"DnsEntries": [
{
"DnsName": "vpce-xxxx-4cgcwtqq.ssm.ap-northeast-1.vpce.amazonaws.com",
"HostedZoneId": "Z2E726K9Y6RL4W"
},
{
"DnsName": "vpce-xxxx-4cgcwtqq-ap-northeast-1c.ssm.ap-northeast-1.vpce.amazonaws.com",
"HostedZoneId": "Z2E726K9Y6RL4W"
},
{
"DnsName": "ssm.ap-northeast-1.amazonaws.com",
"HostedZoneId": "ZONEIDPENDING"
}
],
"CreationTimestamp": "2023-08-xxT02:38:35.644000+00:00",
"OwnerId": "066576575514"
}
}
タグ付けをします。
aws ec2 create-tags --resources vpce-xxxx --tags Key=Name,Value=ssm-cli
まとめ
- VPC Endpoint、AWS PrivateLinkを使うことで、VPCからIGW、NatGWを経由せずにVPC外サービスと直接通信が可能になる
- Gateway型とInterface型に分かれる
- Gateway型はS3やDynamoDBと接続
- Interface型はSSM、Clourwatchなどのサポートされているサービスと接続