기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
VPC에서 AWS Transform 웹 애플리케이션에 액세스
AWS PrivateLink 를 사용하여 VPC에서 API에 AWS Transform 비공개로 액세스하는 경우 웹 애플리케이션에 추가 네트워크 구성이 필요합니다. 인터넷 연결이 필요한 CloudFront를 통해 정적 콘텐츠(HTML, JavaScript, CSS)를 제공합니다. 웹 애플리케이션의 API 호출은 VPC 엔드포인트를 통과하여 완전히 비공개로 유지됩니다.
이 가이드에서는 VPC를 필수 도메인으로만 잠그면서 웹 애플리케이션이 로드될 수 있도록 VPC에서 제어된 인터넷 송신을 구성하는 방법을 보여줍니다.
작동 방식
AWS Transform 웹 애플리케이션은 두 개의 네트워크 경로를 사용합니다.
-
API 호출 - 웹 애플리케이션(작업 시작, 워크스페이스 보기 등)과 상호 작용할 때 브라우저는 API 요청을 로 보냅니다
api.transform..region.on.awscom.amazonaws.VPC 엔드포인트와 프라이빗 DNS를 활성화하면 이러한 요청은 VPC의 프라이빗 IP 주소로 확인되고 AWS 네트워크를 벗어나지 않습니다.region.api.transform -
정적 콘텐츠 - 웹 애플리케이션의 HTML, JavaScript 및 CSS 파일은를 통해 CloudFront를 통해 제공됩니다
. CloudFront 콘텐츠 전송은 퍼블릭 인터넷을 통해서만 사용할 수 있으므로 이러한 파일을 로드하려면 인터넷 연결이 필요합니다.tenant-id.transform.region.on.aws -
인증 - 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 게이트웨이 서브넷에서 반환 경로를 구성해야 합니다. 이렇게 하지 않으면 도메인 기반 필터링 규칙이 작동하지 않습니다.
사전 조건
시작하기 전에 다음을 갖추었는지 확인하세요.
-
VPC 리소스, 네트워크 방화벽 및 NAT 게이트웨이를 생성할 수 있는 권한이 있는 AWS 계정입니다.
-
인스턴스 또는 워크로드가 실행되는 프라이빗 서브넷이 있는 VPC입니다.
-
VPC에 연결된 인터넷 게이트웨이(또는 VPC 생성 권한).
-
프라이빗 DNS가 활성화된
com.amazonaws.의 AWS Transform VPC 엔드포인트입니다. 웹 애플리케이션 브라우저 클라이언트에서 사용하는 엔드포인트입니다. 엔드포인트 생성에 대한 지침은 섹션을 참조하세요AWS Transform 및 인터페이스 엔드포인트(AWS PrivateLink).region.api.transform
VPC 엔드포인트 정책 구성
com.amazonaws. VPC 엔드포인트에 사용자 지정 엔드포인트 정책이 있는 경우 AWS Transform 작업을 허용하는 문을 추가해야 합니다. 이렇게 하지 않으면 웹 애플리케이션이 엔드포인트를 통해 API를 호출할 수 없습니다.region.api.transform
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-idyour-vpc-id\ --cidr-blockfirewall-subnet-cidr\ --availability-zoneyour-az\ --regionregion
2단계: NAT 게이트웨이에 대한 퍼블릭 서브넷 생성
aws ec2 create-subnet \ --vpc-idyour-vpc-id\ --cidr-blockpublic-subnet-cidr\ --availability-zoneyour-az\ --regionregion
3단계: 퍼블릭 서브넷 라우팅 테이블 구성
인터넷 트래픽을 인터넷 게이트웨이로 라우팅하는 퍼블릭 서브넷의 라우팅 테이블을 생성합니다.
# Create route table PUB_RTB=$(aws ec2 create-route-table \ --vpc-idyour-vpc-id\ --regionregion\ --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-idyour-igw-id\ --regionregion# Associate with public subnet aws ec2 associate-route-table \ --route-table-id $PUB_RTB \ --subnet-idpublic-subnet-id\ --regionregion
4단계: NAT 게이트웨이 생성
# Allocate an Elastic IP EIP=$(aws ec2 allocate-address --domain vpc \ --regionregion--query 'AllocationId' --output text) # Create NAT Gateway in the public subnet NAT_ID=$(aws ec2 create-nat-gateway \ --subnet-idpublic-subnet-id\ --allocation-id $EIP \ --regionregion\ --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 --regionregion
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" } } }' \ --regionregion
region을 프로필이 설치된 AWS 리전으로 바꿉니다 AWS Transform (예: us-east-1). directory-id를 IAM Identity Center 디렉터리 ID(예: d-1234567890)로 바꿉니다. 디렉터리 ID는 IAM Identity Center 콘솔에서 찾을 수 있습니다.
다음 표에서는 허용되는 도메인에 대해 설명합니다.
| 도메인 | 용도 |
|---|---|
.cloudfront.net |
CloudFront CDN - 웹 애플리케이션 정적 자산(JavaScript, CSS, 이미지)을 제공합니다. |
.transform. |
웹 애플리케이션 테넌트 URL - 브라우저가 CloudFront를 통해이 도메인에서 초기 페이지를 로드합니다. |
|
SSO 로그인 리디렉션 페이지 |
.s3. |
S3 미리 서명된 URLs - 아티팩트 업로드 및 다운로드 |
oidc. |
SSO 인증을 위한 OIDC 토큰 교환 |
portal.sso. |
SSO 포털 로그인 페이지 |
assets.sso-portal. |
SSO 포털 정적 자산(CSS, JavaScript) |
|
조직의 IAM Identity Center 포털 |
참고
.cloudfront.net 와일드카드는 AWS Transform 웹 애플리케이션의 배포뿐만 아니라 모든 CloudFront 배포에 대한 트래픽을 허용합니다. CloudFront 엣지 IPs는 배포 간에 공유되고 TLS SNI 검사는 동일한 도메인 뒤의 개별 배포를 구별할 수 없으므로 더 좁은 도메인 필터는 불가능합니다.
참고
API 호출은 api.transform. 통과 AWS PrivateLink 하며 인터넷 송신이 필요하지 않습니다. 방화벽의 영향을 받지 않습니다.region.on.aws
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 --regionregion\ --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\"] }" \ --regionregion
7단계: 네트워크 방화벽 생성
# Get the policy ARN FW_POLICY_ARN=$(aws network-firewall describe-firewall-policy \ --firewall-policy-name transform-webapp-policy \ --regionregion\ --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-idyour-vpc-id\ --subnet-mappings SubnetId=firewall-subnet-id\ --regionregion# Wait for the firewall to become READY (3-5 minutes) while true; do STATUS=$(aws network-firewall describe-firewall \ --firewall-name transform-webapp-firewall \ --regionregion\ --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 \ --regionregion\ --query "FirewallStatus.SyncStates.\"your-az\".Attachment.EndpointId" \ --output text) echo "Firewall endpoint: $FW_ENDPOINT"
9단계: 방화벽 서브넷 라우팅 테이블 구성
방화벽 서브넷에서 NAT 게이트웨이로 인터넷 바운드 트래픽을 라우팅합니다.
FW_RTB=$(aws ec2 create-route-table \ --vpc-idyour-vpc-id\ --regionregion\ --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 \ --regionregionaws ec2 associate-route-table \ --route-table-id $FW_RTB \ --subnet-idfirewall-subnet-id\ --regionregion
10단계: 프라이빗 서브넷 라우팅 테이블 업데이트
프라이빗 서브넷에서 방화벽을 통해 모든 인터넷 바인딩 트래픽을 라우팅합니다.
aws ec2 create-route \ --route-table-idprivate-subnet-route-table-id\ --destination-cidr-block 0.0.0.0/0 \ --vpc-endpoint-id $FW_ENDPOINT \ --regionregion
기본 경로가 이미 있는 경우 replace-route 대신를 사용합니다create-route.
11단계: 대칭 반환 경로 추가(필수)
중요
이 단계는 매우 중요합니다. Network Firewall은 TLS SNI 검사를 사용하며 TCP 연결의 양방향을 확인해야 합니다. NAT 게이트웨이 서브넷의 라우팅 테이블에 프라이빗 서브넷으로 향하는 반환 트래픽을 방화벽을 통해 다시 보내는 경로를 추가합니다.
aws ec2 create-route \ --route-table-id $PUB_RTB \ --destination-cidr-blockprivate-subnet-cidr\ --vpc-endpoint-id $FW_ENDPOINT \ --regionregion
private-subnet-cidr을 프라이빗 서브넷의 CIDR 블록으로 바꿉니다(예: 10.0.144.0/20).
대칭 라우팅이 없으면 방화벽은 트래픽의 한 방향만 볼 수 있습니다. TLS 검사 엔진은 TLS 핸드셰이크에서 서버 이름 표시(SNI)를 추출할 수 없으며 모든 도메인 기반 규칙이 자동으로 실패합니다.
12단계: IPv6 기본 경로 제거(있는 경우)
프라이빗 서브넷 라우팅 테이블에 인터넷 게이트웨이를 직접 가리키는 IPv6 기본 라우팅(::/0)이 있는 경우 IPv6-capable 대상으로 방화벽을 우회합니다. 제거:
aws ec2 delete-route \ --route-table-idprivate-subnet-route-table-id\ --destination-ipv6-cidr-block ::/0 \ --regionregion
Verification(확인)
프라이빗 서브넷의 인스턴스에서 구성을 확인합니다.
# 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 호출이 차단됨
-
도메인은 VPC 엔드포인트를 통해 프라이빗 IP 주소로
api.transform.확인되어야 하며 인터넷 방화벽에 연결해서는 안 됩니다.region.on.aws-
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_established및STRICT_ORDER를 기본 작업alert_established으로 사용하는지 확인합니다.
-
비용 고려 사항
| Resource | 대략적인 비용 |
|---|---|
| Network Firewall | 가용 영역당 ~$0.395/시간(~$288/월) |
| NAT 게이트웨이 | ~$0.045/시간(~$33/월) + 데이터 처리 요금 |
| 탄력적 IP(퍼블릭 IPv4) | ~$0.005/시간(~$3.60/월) |
| Network Firewall 데이터 처리 | $0.065/GB |
| NAT 게이트웨이 데이터 처리 | $0.045/GB |
예상 기본 비용은 단일 가용 영역 배포의 경우 월 약 325 USD입니다. 프로덕션 배포의 경우 프라이빗 서브넷이 있는 각 가용 영역에 방화벽, NAT 게이트웨이 및 관련 서브넷을 배포합니다.
정리
이 가이드에서 생성한 모든 리소스를 제거하려면 다음 명령을 역순으로 실행합니다. 자리 표시자를 배포의 리소스 IDs로 바꿉니다. AWS 관리 콘솔에서 또는 설정 단계의 describe 명령을 사용하여 이러한 값을 찾을 수 있습니다.
# Remove return route from NAT Gateway subnet aws ec2 delete-route --route-table-idpub-rtb-id\ --destination-cidr-blockprivate-subnet-cidr\ --regionregion# Remove route from private subnet aws ec2 delete-route \ --route-table-idprivate-subnet-route-table-id\ --destination-cidr-block 0.0.0.0/0 --regionregion# Delete Network Firewall (takes ~5 minutes) aws network-firewall delete-firewall \ --firewall-name transform-webapp-firewall \ --regionregion# Delete firewall policy and rule group aws network-firewall delete-firewall-policy \ --firewall-policy-name transform-webapp-policy \ --regionregionaws network-firewall delete-rule-group \ --rule-group-name transform-webapp-domains \ --type STATEFUL --regionregion# Delete NAT Gateway (wait ~5 minutes for full deletion) aws ec2 delete-nat-gateway --nat-gateway-idnat-gateway-id\ --regionregion# Release Elastic IP aws ec2 release-address --allocation-ideip-allocation-id\ --regionregion# Delete subnets aws ec2 delete-subnet --subnet-idfirewall-subnet-id\ --regionregionaws ec2 delete-subnet --subnet-idpublic-subnet-id\ --regionregion