View a markdown version of this page

VPC から AWS Transform ウェブアプリケーションにアクセスする - AWS 変換

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

VPC から AWS Transform ウェブアプリケーションにアクセスする

AWS PrivateLink を使用して VPC から AWS Transform API にプライベートにアクセスする場合、ウェブアプリケーションには追加のネットワーク設定が必要です。インターネット接続を必要とする CloudFront を介して静的コンテンツ (HTML、JavaScript、CSS) を提供します。ウェブアプリケーションからの API コールは VPC エンドポイントを通過し、完全にプライベートのままになります。

このガイドでは、VPC から制御されたインターネット出力を設定して、VPC を必要なドメインのみにロックしたままウェブアプリケーションがロードできるようにする方法について説明します。

仕組み

AWS Transform ウェブアプリケーションは 2 つのネットワークパスを使用します。

  • API コール – ウェブアプリケーション (ジョブの開始、ワークスペースの表示など) を操作すると、ブラウザは API リクエストを に送信しますapi.transform.region.on.awscom.amazonaws.region.api.transform VPC エンドポイントとプライベート DNS を有効にすると、これらのリクエストは VPC 内のプライベート IP アドレスに解決され、 AWS ネットワークを離れることはありません。

  • 静的コンテンツ – ウェブアプリケーションの HTML、JavaScript、および CSS ファイルは、 を介して CloudFront を介して提供されますtenant-id.transform.region.on.aws。CloudFront コンテンツ配信はパブリックインターネットでのみ利用できるため、これらのファイルをロードするにはインターネット接続が必要です。

  • 認証 – AWS IAM Identity Center のサインインフローは region.signin.awsを使用します。これにはインターネット接続も必要です。

セキュリティを維持しながらウェブアプリケーションを有効にするには、 AWS Network Firewall とドメインベースのフィルタリングを使用して、制御された出力パスを作成します。これにより、VPC は他のすべてのインターネットトラフィックをブロックしながら、ウェブアプリケーションに必要な特定のドメインにのみ到達できます。

アーキテクチャ

次の図は、ウェブアプリケーショントラフィックのネットワークパスを示しています。

EC2 Instance / Workspace (Private Subnet) | | Route: 0.0.0.0/0 → Network Firewall Endpoint v AWS Network Firewall (Firewall Subnet) | Allows: *.cloudfront.net, *.transform.<region>.on.aws, | <region>.signin.aws, SSO domains, S3 presigned URLs | Blocks: everything else (TLS SNI inspection) | | Route: 0.0.0.0/0 → NAT Gateway v NAT Gateway (Public Subnet) | | Route: 0.0.0.0/0 → Internet Gateway v Internet Gateway → CloudFront Edge Locations
重要

Network Firewall は、TLS SNI 検査を実行するために、トラフィックの両方向 (対称ルーティング) を確認する必要があります。プライベートサブネット宛てのトラフィックをファイアウォール経由で送信するリターンルートを NAT Gateway サブネットで設定する必要があります。これを行わないと、ドメインベースのフィルタリングルールは機能しません。

前提条件

開始する前に、以下があることを確認してください。

  • VPC リソース、Network Firewall、NAT Gateway を作成するアクセス許可を持つ AWS アカウント。

  • インスタンスまたはワークロードが実行されるプライベートサブネットを持つ VPC。

  • VPC にアタッチされたインターネットゲートウェイ (または作成するためのアクセス許可)。

  • プライベート DNS が有効になっていcom.amazonaws.region.api.transformる の AWS Transform VPC エンドポイント。これは、ウェブアプリケーションブラウザクライアントで使用されるエンドポイントです。エンドポイントの作成手順については、「」を参照してくださいAWS Transform およびインターフェイスエンドポイント (AWS PrivateLink)

VPC エンドポイントポリシーの設定

com.amazonaws.region.api.transform VPC エンドポイントにカスタムエンドポイントポリシーがある場合は、 AWS Transform オペレーションを許可するステートメントを追加する必要があります。これを行わないと、ウェブアプリケーションはエンドポイントを介して API コールを実行できなくなります。

VPC エンドポイントポリシーに次のステートメントを追加します。AWS_TRANSFORM_PROFILE_ARN を、設定ページの AWS Transform コンソールにある AWS Transform サービスプロファイル ARN に置き換えます。

{ "Statement": [ { "Sid": "AllowAWSTransform", "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "aws:PrincipalArn": [ "AWS_TRANSFORM_PROFILE_ARN" ] } } } ] }
注記

VPC エンドポイントがデフォルトのポリシー (フルアクセス) を使用している場合は、変更は不要で、このステップをスキップできます。

制御されたインターネット出力の設定

AWS Transform ウェブアプリケーションのドメインベースのフィルタリングを使用して Network Firewall を設定するには、次の手順を実行します。

ステップ 1: ファイアウォールサブネットを作成する

Network Firewall エンドポイント専用の小さな /28 サブネットを作成します。このサブネットは、プライベートサブネットと同じアベイラビリティーゾーンにある必要があります。

aws ec2 create-subnet \ --vpc-id your-vpc-id \ --cidr-block firewall-subnet-cidr \ --availability-zone your-az \ --region region

ステップ 2: NAT ゲートウェイのパブリックサブネットを作成する

aws ec2 create-subnet \ --vpc-id your-vpc-id \ --cidr-block public-subnet-cidr \ --availability-zone your-az \ --region region

ステップ 3: パブリックサブネットルートテーブルを設定する

インターネットトラフィックをインターネットゲートウェイにルーティングするパブリックサブネットのルートテーブルを作成します。

# Create route table PUB_RTB=$(aws ec2 create-route-table \ --vpc-id your-vpc-id \ --region region \ --query 'RouteTable.RouteTableId' --output text) # Add default route to internet gateway aws ec2 create-route \ --route-table-id $PUB_RTB \ --destination-cidr-block 0.0.0.0/0 \ --gateway-id your-igw-id \ --region region # Associate with public subnet aws ec2 associate-route-table \ --route-table-id $PUB_RTB \ --subnet-id public-subnet-id \ --region region

ステップ 4: NAT ゲートウェイを作成する

# Allocate an Elastic IP EIP=$(aws ec2 allocate-address --domain vpc \ --region region --query 'AllocationId' --output text) # Create NAT Gateway in the public subnet NAT_ID=$(aws ec2 create-nat-gateway \ --subnet-id public-subnet-id \ --allocation-id $EIP \ --region region \ --query 'NatGateway.NatGatewayId' --output text) # Wait for NAT Gateway to become available (~2 minutes) aws ec2 wait nat-gateway-available \ --nat-gateway-ids $NAT_ID --region region

ステップ 5: Network Firewall ルールグループを作成する

AWS Transform ウェブアプリケーションに必要なドメインへのトラフィックのみを許可するステートフルルールグループを作成します。

aws network-firewall create-rule-group \ --rule-group-name transform-webapp-domains \ --type STATEFUL \ --capacity 100 \ --rule-group '{ "StatefulRuleOptions": { "RuleOrder": "STRICT_ORDER" }, "RulesSource": { "RulesSourceList": { "Targets": [ ".cloudfront.net", ".transform.region.on.aws", "region.signin.aws", ".s3.region.amazonaws.com", "oidc.region.amazonaws.com", "portal.sso.region.amazonaws.com", "assets.sso-portal.region.amazonaws.com", "directory-id.awsapps.com" ], "TargetTypes": ["TLS_SNI", "HTTP_HOST"], "GeneratedRulesType": "ALLOWLIST" } } }' \ --region region

region を、プロファイルがインストールされている AWS リージョン ( など) に置き換えます AWS Transform us-east-1directory-id を IAM Identity Center ディレクトリ ID に置き換えます (例: d-1234567890)。ディレクトリ ID は IAM Identity Center コンソールで確認できます。

次の表に、許可されたドメインを示します。

ドメイン 目的
.cloudfront.net CloudFront CDN – ウェブアプリケーションの静的アセット (JavaScript、CSS、イメージ) を提供します
.transform.region.on.aws ウェブアプリケーションテナント URL – ブラウザは CloudFront を介してこのドメインから最初のページをロードします
region.signin.aws SSO サインインリダイレクトページ
.s3.region.amazonaws.com S3 署名付き URLs – アーティファクトのアップロードとダウンロード
oidc.region.amazonaws.com SSO 認証のための OIDC トークン交換
portal.sso.region.amazonaws.com SSO ポータルのログインページ
assets.sso-portal.region.amazonaws.com SSO ポータルの静的アセット (CSS、JavaScript)
directory-id.awsapps.com 組織の IAM Identity Center ポータル
注記

.cloudfront.net ワイルドカードは、 AWS Transform ウェブアプリケーションの だけでなく、任意の CloudFront ディストリビューションへのトラフィックを許可します。CloudFront エッジ IPs はディストリビューション間で共有され、TLS SNI 検査では同じドメインの背後にある個々のディストリビューションを区別できないため、ドメインフィルターを絞り込むことはできません。

注記

api.transform.region.on.aws経由する API コール AWS PrivateLink 。インターネット出力は必要ありません。ファイアウォールの影響を受けません。

ステップ 6: ファイアウォールポリシーを作成する

ポリシーでは、デフォルトのアクションdrop_establishedとして でSTRICT_ORDERルール評価を使用する必要があります。これにより、許可リストと一致しないトラフィックはすべて削除されます。

# Get the rule group ARN RG_ARN=$(aws network-firewall describe-rule-group \ --rule-group-name transform-webapp-domains \ --type STATEFUL --region region \ --query 'RuleGroupResponse.RuleGroupArn' --output text) # Create the firewall policy aws network-firewall create-firewall-policy \ --firewall-policy-name transform-webapp-policy \ --firewall-policy "{ \"StatelessDefaultActions\": [\"aws:forward_to_sfe\"], \"StatelessFragmentDefaultActions\": [\"aws:forward_to_sfe\"], \"StatefulRuleGroupReferences\": [ { \"ResourceArn\": \"$RG_ARN\", \"Priority\": 1 } ], \"StatefulEngineOptions\": { \"RuleOrder\": \"STRICT_ORDER\" }, \"StatefulDefaultActions\": [\"aws:drop_established\", \"aws:alert_established\"] }" \ --region region

ステップ 7: Network Firewall を作成する

# Get the policy ARN FW_POLICY_ARN=$(aws network-firewall describe-firewall-policy \ --firewall-policy-name transform-webapp-policy \ --region region \ --query 'FirewallPolicyResponse.FirewallPolicyArn' --output text) # Create the firewall aws network-firewall create-firewall \ --firewall-name transform-webapp-firewall \ --firewall-policy-arn $FW_POLICY_ARN \ --vpc-id your-vpc-id \ --subnet-mappings SubnetId=firewall-subnet-id \ --region region # Wait for the firewall to become READY (3-5 minutes) while true; do STATUS=$(aws network-firewall describe-firewall \ --firewall-name transform-webapp-firewall \ --region region \ --query 'FirewallStatus.Status' --output text) echo "Status: $STATUS" if [ "$STATUS" = "READY" ]; then break; fi sleep 15 done

ステップ 8: ファイアウォールエンドポイント ID を取得する

FW_ENDPOINT=$(aws network-firewall describe-firewall \ --firewall-name transform-webapp-firewall \ --region region \ --query "FirewallStatus.SyncStates.\"your-az\".Attachment.EndpointId" \ --output text) echo "Firewall endpoint: $FW_ENDPOINT"

ステップ 9: ファイアウォールサブネットルートテーブルを設定する

インターネットにバインドされたトラフィックをファイアウォールサブネットから NAT ゲートウェイにルーティングします。

FW_RTB=$(aws ec2 create-route-table \ --vpc-id your-vpc-id \ --region region \ --query 'RouteTable.RouteTableId' --output text) aws ec2 create-route \ --route-table-id $FW_RTB \ --destination-cidr-block 0.0.0.0/0 \ --nat-gateway-id $NAT_ID \ --region region aws ec2 associate-route-table \ --route-table-id $FW_RTB \ --subnet-id firewall-subnet-id \ --region region

ステップ 10: プライベートサブネットルートテーブルを更新する

プライベートサブネットからインターネットにバインドされたすべてのトラフィックをファイアウォール経由でルーティングします。

aws ec2 create-route \ --route-table-id private-subnet-route-table-id \ --destination-cidr-block 0.0.0.0/0 \ --vpc-endpoint-id $FW_ENDPOINT \ --region region

デフォルトのルートが既に存在する場合は、 replace-route の代わりに を使用しますcreate-route

ステップ 11: 対称リターンルートを追加する (必須)

重要

このステップは重要です。Network Firewall は TLS SNI 検査を使用し、TCP 接続の両方向を確認する必要があります。プライベートサブネット宛てのリターントラフィックをファイアウォール経由で送信するルートを NAT Gateway サブネットのルートテーブルに追加します。

aws ec2 create-route \ --route-table-id $PUB_RTB \ --destination-cidr-block private-subnet-cidr \ --vpc-endpoint-id $FW_ENDPOINT \ --region region

private-subnet-cidr をプライベートサブネットの CIDR ブロック (例: ) に置き換えます10.0.144.0/20

対称ルーティングがない場合、ファイアウォールはトラフィックの一方向のみを表示します。TLS 検査エンジンは TLS ハンドシェイクからサーバー名表示 (SNI) を抽出できず、すべてのドメインベースのルールはサイレントに失敗します。

ステップ 12: IPv6 デフォルトルートを削除する (存在する場合)

プライベートサブネットルートテーブルの IPv6 デフォルトルート (::/0) がインターネットゲートウェイを直接指している場合、IPv6-capableの送信先のファイアウォールをバイパスします。削除します。

aws ec2 delete-route \ --route-table-id private-subnet-route-table-id \ --destination-ipv6-cidr-block ::/0 \ --region region

検証

プライベートサブネットのインスタンスから、設定を確認します。

# Should SUCCEED - web application content via CloudFront (allowed) curl -vL --connect-timeout 15 \ 'https://tenant-id.transform.region.on.aws' # Should SUCCEED - API via PrivateLink (does not use firewall) curl -v --connect-timeout 15 \ 'https://api.transform.region.on.aws/' # Should FAIL - non-allowlisted domain (blocked by firewall) curl -v --connect-timeout 15 'https://www.example.com' # Expected: TLS connection error (firewall drops after SNI inspection)

トラブルシューティング

api.transform への API コールはファイアウォールによってブロックされます

ドメインapi.transform.region.on.awsは VPC エンドポイントを介してプライベート IP アドレスに解決され、インターネットファイアウォールに到達しないでください。

  • com.amazonaws.region.api.transform エンドポイントが作成されていることを確認します。

  • エンドポイントでプライベート DNS が有効になっていることを確認します。

    aws ec2 describe-vpc-endpoints \ --filters "Name=service-name,Values=com.amazonaws.region.api.transform" \ --query 'VpcEndpoints[*].[State,PrivateDnsEnabled]' \ --output table

    正常な出力: available | True

ウェブアプリケーションがロードされない (接続タイムアウト)
  • プライベートサブネットルートテーブルにファイアウォールエンドポイントを指す0.0.0.0/0ルートがあることを確認します。

  • ファイアウォールサブネットルートテーブルに NAT ゲートウェイを指す0.0.0.0/0ルートがあることを確認します。

  • NAT ゲートウェイが available状態であることを確認します。

許可されていないドメインはブロックされません
  • インターネットゲートウェイを指す IPv6 ::/0ルートを確認します。これにより、ファイアウォールがバイパスされます。削除します (ステップ 12)。

  • 対称ルーティングが設定されていることを確認します。NAT Gateway サブネットルートテーブルには、プライベートサブネット CIDR のファイアウォール経由のリターンルートが必要です (ステップ 11)。

  • ファイアウォールポリシーが drop_establishedSTRICT_ORDER をデフォルトアクションalert_establishedとして使用していることを確認します。

コストに関する考慮事項

[リソース] 概算コスト
Network Firewall アベイラビリティーゾーンあたり最大 0.395 USD/時間 (最大 288 USD/月)
NAT Gateway ~0.045 USD/時間 (~33 USD/月) + データ処理料金
Elastic IP (パブリック IPv4) ~0.005 USD/時間 (~3.60 USD/月)
Network Firewall データ処理 0.065 USD/GB
NAT Gateway データ処理 0.045 USD/GB

1 つのアベイラビリティーゾーンデプロイの推定ベースコストは約 325 USD/月です。本番デプロイでは、プライベートサブネットが存在する各アベイラビリティーゾーンにファイアウォール、NAT ゲートウェイ、および関連するサブネットをデプロイします。

クリーンアップ

このガイドで作成されたすべてのリソースを削除するには、次のコマンドを逆の順序で実行します。プレースホルダーをデプロイIDs に置き換えます。これらの値は、 AWS マネジメントコンソールで、またはセットアップステップの describe コマンドを使用して確認できます。

# Remove return route from NAT Gateway subnet aws ec2 delete-route --route-table-id pub-rtb-id \ --destination-cidr-block private-subnet-cidr \ --region region # Remove route from private subnet aws ec2 delete-route \ --route-table-id private-subnet-route-table-id \ --destination-cidr-block 0.0.0.0/0 --region region # Delete Network Firewall (takes ~5 minutes) aws network-firewall delete-firewall \ --firewall-name transform-webapp-firewall \ --region region # Delete firewall policy and rule group aws network-firewall delete-firewall-policy \ --firewall-policy-name transform-webapp-policy \ --region region aws network-firewall delete-rule-group \ --rule-group-name transform-webapp-domains \ --type STATEFUL --region region # Delete NAT Gateway (wait ~5 minutes for full deletion) aws ec2 delete-nat-gateway --nat-gateway-id nat-gateway-id \ --region region # Release Elastic IP aws ec2 release-address --allocation-id eip-allocation-id \ --region region # Delete subnets aws ec2 delete-subnet --subnet-id firewall-subnet-id \ --region region aws ec2 delete-subnet --subnet-id public-subnet-id \ --region region