2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WindowsでDNSサーバーを構築して、オンプレ想定VPCからGenU閉域モードへ接続してみた

2
Posted at

概要

GenUには、インターネットに出ずにVPC内部だけで利用できる閉域モードがあります。

閉域モードではGenUのWeb UIはALB、各種AWSサービスはVPCエンドポイント経由でアクセスします。そのため、オンプレミス側から使う場合は名前解決の設定が必須です。ALBやAPI Gateway、CognitoなどのFQDNを、GenUのVPC内にあるプライベートIPに解決させる必要があるためです。

g01.png

この記事では、オンプレミス想定のEC2(Windows Server)をオンプレ端末兼オンプレDNSサーバーに見立てて、Route 53 Resolver Inbound Endpointへ条件付きフォワーダーで転送する構成を作り、実際にブラウザからGenUにアクセスできるところまで検証します。

g0.png

  • 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.com
  • cognito-idp.ap-northeast-1.amazonaws.com
  • lambda.ap-northeast-1.amazonaws.com
  • s3.ap-northeast-1.amazonaws.com

手順7: ブラウザから動作確認

オンプレ想定EC2のブラウザからhttps://genu.example.localにアクセスします。

  • GenUのトップ画面が表示されることを確認し、メールアドレスでログインします。

g02.png

  • チャットが実行できることを確認します。

g03.png

おわりに

閉域モードのGenUは、ALBもVPCエンドポイントも「プライベートIPに解決できること」が前提になります。オンプレ側のDNSで条件付きフォワーダーをRoute 53 Resolver Inbound Endpointに向けるだけで済むので、仕組みが分かればシンプルです。

実際のオンプレ環境では、EC2のWindows DNSではなく既存の社内DNSに同じ条件付きフォワーダーを設定し、Direct Connect経由でResolver Inbound Endpointに到達させる形になります。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?