概要
GenUには、インターネットに出ずにVPC内部だけで利用できる閉域モードがあります。
閉域モードではGenUのWeb UIはALB、各種AWSサービスはVPCエンドポイント経由でアクセスします。そのため、オンプレミス側から使う場合は名前解決の設定が必須です。ALBやAPI Gateway、CognitoなどのFQDNを、GenUのVPC内にあるプライベートIPに解決させる必要があるためです。
この記事では、オンプレミス想定のEC2(Windows Server)をオンプレ端末兼オンプレDNSサーバーに見立てて、Route 53 Resolver Inbound Endpointへ条件付きフォワーダーで転送する構成を作り、実際にブラウザからGenUにアクセスできるところまで検証します。
- GenU VPC:
10.0.0.0/16 - オンプレ想定VPC:
172.18.0.0/16 - 両VPCはVPC Peering + ルートテーブル設定済み
※本記事に登場するVPC ID / セキュリティグループID / アカウントID / ドメイン名 / API Gateway ID / IPアドレスは、すべてダミー値に置き換えています。
デプロイ時に指定できるパラメータ
閉域モードでGenUをデプロイする際、名前解決や暗号化に関する以下のパラメータを指定できます。
| パラメータ | 説明 |
|---|---|
closedNetworkDomainName |
GenUのドメイン名。指定するとPrivate Hosted ZoneがCDK側で生成され、GenUのVPCに紐づけられる(手動作成は不要)。closedNetworkCertificateArnとは両方指定するか、両方指定しないかのどちらか。 |
closedNetworkCreateResolverEndpoint |
Route 53のResolver Endpointを生成するかどうか。デフォルトtrue。 |
closedNetworkCertificateArn |
GenUにドメインを付与する場合に指定するACMのARN。ACMは手動で生成する。指定しない場合、GenUはApplication Load Balancerのデフォルトのエンドポイントで公開される。 |
今回はclosedNetworkDomainNameを使ってプライベートホストゾーンを作成した状態で検証します。ACM証明書(closedNetworkCertificateArn)は今回は使用しませんが、指定すればALBに証明書が設定され暗号化通信になります。
前提
- GenU(閉域モード)はデプロイ済み
- オンプレ想定VPC / VPC Peering / ルートテーブルは作成済み
- オンプレ想定のEC2(Windows Server)は作成済み
検証のため、以降のセキュリティグループ変更はCDKではなくAWS CLIで直接行っています。
手順1: VPCエンドポイントのSGにオンプレCIDRを追加
GenUデプロイ時に作成されたVPCエンドポイントのセキュリティグループは、GenU VPCからのアクセスのみが許可された状態です。そのため、セキュリティグループにオンプレミスのCIDRを追加します。
まず、どのVPCエンドポイントがどのセキュリティグループを使っているかを洗い出します。
VPC1=vpc-xxxxxxxxxxxxxxxxx # GenUのVPC ID
# VPCEにアタッチされているSGを洗い出す
aws ec2 describe-vpc-endpoints \
--filters "Name=vpc-id,Values=$VPC1" \
--query "VpcEndpoints[?VpcEndpointType=='Interface'].{Svc:ServiceName,SG:Groups[0].GroupId}" \
--output table
結果として、下記の3グループに分かれていました。
| SG | 対象エンドポイント |
|---|---|
sg-aaaaaaaaaaaaaaaaa |
execute-api, cognito-idp, cognito-identity, lambda, s3, sts, logs, ecr.api, ecr.dkr, polly, transcribe, kendra, bedrock-runtime, bedrock-agent, bedrock-agent-runtime, bedrock-agentcore |
sg-bbbbbbbbbbbbbbbbb |
transcribestreaming |
sg-ccccccccccccccccc |
ssm, ssmmessages, ec2messages(Session Manager用) |
GenUの利用に必要なsg-aaaa...(各種サービス)とsg-bbbb...(transcribestreaming)に、オンプレCIDRからのHTTPSを許可します。
# 各種VPCエンドポイント用SG
aws ec2 authorize-security-group-ingress \
--group-id sg-aaaaaaaaaaaaaaaaa \
--ip-permissions 'IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges=[{CidrIp=172.18.0.0/16,Description="onpr verification"}]'
# transcribestreamingは443に加えて8443も使う
aws ec2 authorize-security-group-ingress \
--group-id sg-bbbbbbbbbbbbbbbbb \
--ip-permissions \
'IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges=[{CidrIp=172.18.0.0/16,Description="onpr verification"}]' \
'IpProtocol=tcp,FromPort=8443,ToPort=8443,IpRanges=[{CidrIp=172.18.0.0/16,Description="onpr verification"}]'
適用確認を行います。
aws ec2 describe-security-groups \
--group-ids sg-aaaaaaaaaaaaaaaaa sg-bbbbbbbbbbbbbbbbb \
--query "SecurityGroups[].{Id:GroupId,Rules:IpPermissions[].{Port:FromPort,Cidr:IpRanges[].CidrIp}}" \
--output json
下記、オンプレ想定VPCのCIDRである172.18.0.0/16が追加されていることを確認します。
[
{
"Id": "sg-aaaaaaaaaaaaaaaaa",
"Rules": [{ "Port": 443, "Cidr": ["10.0.0.0/16", "172.18.0.0/16"] }]
},
{
"Id": "sg-bbbbbbbbbbbbbbbbb",
"Rules": [
{ "Port": 8443, "Cidr": ["10.0.0.0/16", "172.18.0.0/16"] },
{ "Port": 443, "Cidr": ["10.0.0.0/16", "172.18.0.0/16"] }
]
}
]
手順2: ALBのセキュリティグループを必要なCIDRに絞る
閉域モードのALBはInternalですが、SGのインバウンドが0.0.0.0/0になっています。VPC外に露出しない構成ではあるものの、必要なCIDRに絞っておきます。
ALBSG=sg-ddddddddddddddddd
aws ec2 describe-security-groups --group-ids $ALBSG \
--query "SecurityGroups[].IpPermissions" --output json
[[{
"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443,
"IpRanges": [{ "Description": "Allow from anyone on port 443", "CidrIp": "0.0.0.0/0" }]
}]]
必要なCIDRを追加してから0.0.0.0/0を削除します。
# 1. 必要なCIDRを追加
aws ec2 authorize-security-group-ingress \
--group-id $ALBSG \
--ip-permissions \
'IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges=[{CidrIp=172.18.0.0/16,Description="onpr"},{CidrIp=10.0.0.0/16,Description="GenU VPC"}]'
# 2. 0.0.0.0/0を削除
aws ec2 revoke-security-group-ingress \
--group-id $ALBSG \
--ip-permissions \
'IpProtocol=tcp,FromPort=443,ToPort=443,IpRanges=[{CidrIp=0.0.0.0/0}]'
下記のようにオンプレ想定VPC(172.18.0.0/16)とGenU VPC(10.0.0.0/16)から接続が許可されていることを確認します。
[[{
"IpProtocol": "tcp", "FromPort": 443, "ToPort": 443,
"IpRanges": [
{ "Description": "onpr", "CidrIp": "172.18.0.0/16" },
{ "Description": "GenU VPC", "CidrIp": "10.0.0.0/16" }
]
}]]
手順3: Windows ServerにDNSサーバー役割を追加
オンプレ想定のEC2(Windows Server)で実行します。
Install-WindowsFeature -Name DNS -IncludeManagementTools
手順4: 条件付きフォワーダーを設定
閉域モードドキュメントの「オンプレから接続する場合のDNSサーバーの設定について」に記載されているエンドポイントのドメインを、Resolver Inbound Endpoint宛てにフォワードします。10.0.0.11,10.0.0.12はResolver Inbound EndpointのIPアドレスです。
$R = @("10.0.0.11","10.0.0.12") # Resolver Inbound EndpointのIP
$zones = @(
"genu.example.local", # closedNetworkDomainName
"execute-api.ap-northeast-1.amazonaws.com",
"cognito-idp.ap-northeast-1.amazonaws.com",
"cognito-identity.ap-northeast-1.amazonaws.com",
"s3.ap-northeast-1.amazonaws.com",
"lambda.ap-northeast-1.amazonaws.com",
"transcribe.ap-northeast-1.amazonaws.com",
"transcribestreaming.ap-northeast-1.amazonaws.com",
"polly.ap-northeast-1.amazonaws.com",
"bedrock-agentcore.ap-northeast-1.amazonaws.com"
)
foreach ($z in $zones) {
Add-DnsServerConditionalForwarderZone -Name $z -MasterServers $R
}
該当ドメインがフォワーダー設定されていることを確認します。
Get-DnsServerZone | ? ZoneType -eq "Forwarder" | Select ZoneName,MasterServers
ZoneName MasterServers
-------- -------------
bedrock-agentcore.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
cognito-identity.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
cognito-idp.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
execute-api.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
genu.example.local {10.0.0.11, 10.0.0.12}
lambda.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
polly.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
s3.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
transcribe.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
transcribestreaming.ap-northeast-1.amazonaws.com {10.0.0.11, 10.0.0.12}
手順5: 一般フォワーダーとクライアント設定
条件付きフォワーダーに該当しない名前(一般的なインターネットの名前解決)は、オンプレ想定VPCのAmazon提供DNS(VPC CIDRの.2)に転送します。そしてNICのDNSを自分自身に向けます。
# onpr VPCのAmazon提供DNS
Add-DnsServerForwarder -IPAddress 172.18.0.2
# NICのDNSを自分自身へ
$if = (Get-NetAdapter | ? Status -eq "Up").ifIndex
Set-DnsClientServerAddress -InterfaceIndex $if -ServerAddresses 127.0.0.1
Clear-DnsClientCache
Clear-DnsServerCache -Force
ipconfig /allでDNSサーバーが127.0.0.1になっていることを確認します。
DNS サーバー. . . . . . . . . . . . .: 127.0.0.1
手順6: 名前解決の確認
nslookupで、各FQDNがGenU VPC(10.0.0.0/16)内のプライベートIPに解決されることを確認します。
nslookup genu.example.local
サーバー: localhost
Address: 127.0.0.1
権限のない回答:
名前: genu.example.local
Addresses: 10.0.x.x
10.0.x.x
同様に以下も確認します。いずれも10.0.0.0/16のプライベートIPが返ればOKです。
xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.comcognito-idp.ap-northeast-1.amazonaws.comlambda.ap-northeast-1.amazonaws.coms3.ap-northeast-1.amazonaws.com
手順7: ブラウザから動作確認
オンプレ想定EC2のブラウザからhttps://genu.example.localにアクセスします。
- GenUのトップ画面が表示されることを確認し、メールアドレスでログインします。
- チャットが実行できることを確認します。
おわりに
閉域モードのGenUは、ALBもVPCエンドポイントも「プライベートIPに解決できること」が前提になります。オンプレ側のDNSで条件付きフォワーダーをRoute 53 Resolver Inbound Endpointに向けるだけで済むので、仕組みが分かればシンプルです。
実際のオンプレ環境では、EC2のWindows DNSではなく既存の社内DNSに同じ条件付きフォワーダーを設定し、Direct Connect経由でResolver Inbound Endpointに到達させる形になります。



