기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
OpenSearch UI 애플리케이션을 위한 친숙한 URL 설정(셀프 서비스)
OpenSearch UI 애플리케이션에는와 같이 자동 생성된 URLshttps://application-. 이러한 URLs은 길고 기억하기 어렵습니다. 친숙한 URL(예: )을 설정할 수 있습니다name-id.Region.opensearch.amazonaws.com.rproxy.goskope.comhttps://prod.example.com. 이 URL은 애플리케이션으로 리디렉션되므로 AWS Management Console을 탐색하지 않고도 대시보드에 직접 액세스할 수 있습니다.
작동 방식
이 솔루션은 CloudFront를 사용하여 친숙한 URL의 요청을 OpenSearch UI 애플리케이션 엔드포인트로 리디렉션합니다. 이 아키텍처는 다음 구성 요소로 구성됩니다.
-
ACM 인증서 - 친숙한 URL에 HTTPS 암호화를 제공합니다.
-
CloudFront KeyValueStore - 하위 도메인 이름과 애플리케이션 URLs 간의 매핑을 저장합니다.
-
CloudFront 함수 - KeyValueStore를 읽고 올바른 애플리케이션 URL로 302 리디렉션을 반환합니다.
-
CloudFront 배포 - TLS를 사용하여 친숙한 URL을 제공하고 함수를 통해 요청을 라우팅합니다.
-
Route 53 DNS 레코드 - CloudFront 배포에 대한 친숙한 URL을 가리킵니다.
친숙한 URL(예: https://prod.example.com)을 방문하면 CloudFront 함수가 해당 애플리케이션 URL을 조회하고 브라우저를 해당 URL로 리디렉션합니다. 애플리케이션은 인증을 직접 처리합니다.
사전 조건
-
엔드포인트 URL이 있는 하나 이상의 OpenSearch UI 애플리케이션. URLs
-
소유한 도메인 이름(예:
example.com). -
도메인에 대한 Route 53의 퍼블릭 호스팅 영역입니다. 없는 경우 자세한 내용은 섹션을 참조하세요Route 53 없이 설정(수동 구성).
-
애플리케이션 URL 매핑 파일을 저장할 Amazon S3 버킷입니다.
를 사용하여 배포 AWS CloudFormation
다음 절차에 따라 CloudFormation 템플릿을 사용하여 친숙한 URL 리디렉션 인프라를 배포합니다.
OpenSearch UI 애플리케이션에 대한 친숙한 URL을 설정하려면
-
표시 이름을 애플리케이션 URLs에 매핑하는 JSON 파일을 생성합니다. 각 키는 하위 도메인이 됩니다(예: 키는이
prod됨https://prod.example.com).{ "data": [ {"key": "prod", "value": "https://application-prod-abc123.us-west-2.opensearch.amazonaws.com"}, {"key": "staging", "value": "https://application-staging-def456.us-east-1.opensearch.amazonaws.com"}, {"key": "analytics", "value": "https://application-analytics-ghi789.eu-west-1.opensearch.amazonaws.com"} ] }이 파일을
opensearch-ui-friendly-url-app-mappings-v1.json로 저장합니다.v1접미사는 이를 매핑의 첫 번째 버전으로 식별합니다. 매핑을 업데이트할 때이 버전이 증가합니다. -
계정의 Amazon S3 버킷에 매핑 파일을 업로드합니다.
aws s3 cp opensearch-ui-friendly-url-app-mappings-v1.json \ s3://your-bucket-name/opensearch-ui-friendly-url-app-mappings-v1.json -
버킷 정책을 추가하여 매핑 파일을 읽을 수 있는 권한을 CloudFront에 부여합니다.
your-bucket-name및your-account-id를 값으로 바꿉니다.aws s3api put-bucket-policy \ --bucketyour-bucket-name\ --policy '{ "Version": "2012-10-17", "Statement": [{ "Sid": "AllowCloudFrontKVSImport", "Effect": "Allow", "Principal": {"Service": "cloudfront.amazonaws.com"}, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*", "Condition": {"StringEquals": {"aws:SourceAccount": "your-account-id"}} }] }'참고
이 버킷 정책은 CloudFront가 KeyValueStore 생성 중에 매핑 파일을 읽을 수 있도록 허용합니다. 그렇지 않으면 "SourceARN에 액세스할 수 없음" 오류와 함께 스택 배포가 실패합니다.
-
다음 옵션 중 하나를 사용하여 CloudFormation 스택을 배포합니다.
옵션 1: 스택 시작(권장)
다음 URL을 복사하여 브라우저에 붙여 넣어 템플릿이 미리 로드된 AWS CloudFormation 빠른 생성 페이지를 엽니다. 파라미터를 입력하고 스택 생성을 선택합니다.
https://us-east-1.console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/quickcreate?templateURL=https://opensearch-ui-quickstart-sample-cfn-templates.s3.us-west-2.amazonaws.com/opensearch-ui-friendly-url/main.yaml&stackName=opensearch-ui-friendly-url¶m_MappingsVersion=v1옵션 2: AWS CLI
자리 표시자 값을 자신의 값으로 바꿉니다.
aws cloudformation create-stack \ --stack-name opensearch-ui-friendly-url \ --template-url https://opensearch-ui-quickstart-sample-cfn-templates.s3.us-west-2.amazonaws.com/opensearch-ui-friendly-url/main.yaml \ --parameters \ ParameterKey=DomainName,ParameterValue=your-domain.com\ ParameterKey=HostedZoneId,ParameterValue=Z0123456789ABCDEFG\ ParameterKey=MappingsBucket,ParameterValue=your-bucket-name\ ParameterKey=MappingsKey,ParameterValue=opensearch-ui-friendly-url-app-mappings-v1.json \ ParameterKey=MappingsVersion,ParameterValue=v1 \ --region us-east-1 -
AWS CLI(옵션 2)를 사용한 경우
us-east-1리전에 스택을 배포합니다. CloudFront에서는 ACM 인증서가에 있어야 합니다us-east-1. OpenSearch UI 애플리케이션은 OpenSearch UI에 대해 지원되는 모든 리전 및 할당량에 있을 수 있습니다. -
스택이 완료될 때까지 기다립니다(약 15분). 진행 상황을 모니터링할 수 있습니다.
aws cloudformation wait stack-create-complete \ --stack-name opensearch-ui-friendly-url \ --region us-east-1 -
리디렉션을 테스트합니다. 브라우저를 열고 로 이동합니다
https://. OpenSearch UI 애플리케이션으로 리디렉션되어야 합니다.prod.your-domain.com를 사용하여 확인할 수도 있습니다
curl.curl -I https://prod.your-domain.com# Expected: HTTP/2 302 # location: https://application-prod-abc123.us-west-2.opensearch.amazonaws.com
다음은 위의 스택 시작 링크 및 CLI 명령에서 사용하는 전체 CloudFormation 템플릿입니다. 에서 직접 다운로드할 수도 있습니다https://opensearch-ui-quickstart-sample-cfn-templates.s3.us-west-2.amazonaws.com/opensearch-ui-friendly-url/main.yaml.
AWSTemplateFormatVersion: '2010-09-09' Metadata: TemplateVersion: '1.0.0' LastUpdated: '2026-08-05' Author: 'OpenSearch UI Team' Description: > OpenSearch UI Friendly URL - Creates a CloudFront distribution with a CloudFront Function that redirects friendly subdomain URLs to OpenSearch Application endpoints. Deploy this template in us-east-1 (required for ACM certificates used with CloudFront). Parameters: DomainName: Type: String Description: "Your domain name (e.g., example.com or subdomain.example.com)" AllowedPattern: "^[a-zA-Z0-9][a-zA-Z0-9-]*(\\.[a-zA-Z0-9][a-zA-Z0-9-]*)+$" HostedZoneId: Type: AWS::Route53::HostedZone::Id Description: "Route 53 Hosted Zone ID for your domain" MappingsBucket: Type: String Description: "S3 bucket name containing your app mappings JSON file" MappingsKey: Type: String Description: "S3 key (path) to your app mappings JSON file" Default: "opensearch-ui-friendly-url-app-mappings.json" MappingsVersion: Type: String Description: "Version identifier for your mappings (change this when updating mappings, e.g., v1, v2, v3)" Default: "v1" AllowedPattern: "^[a-zA-Z0-9-]+$" Resources: # 1. Wildcard TLS Certificate (DNS validated via Route 53) Certificate: Type: AWS::CertificateManager::Certificate Properties: DomainName: !Sub "*.${DomainName}" ValidationMethod: DNS DomainValidationOptions: - DomainName: !Sub "*.${DomainName}" HostedZoneId: !Ref HostedZoneId # 2. CloudFront KeyValueStore with S3 import for app mappings AppMappingStore: Type: AWS::CloudFront::KeyValueStore Properties: Name: !Sub "${AWS::StackName}-kvs-${MappingsVersion}" Comment: !Sub "OpenSearch UI app mappings ${MappingsVersion} for ${DomainName}" ImportSource: SourceType: S3 SourceArn: !Sub "arn:aws:s3:::${MappingsBucket}/${MappingsKey}" # 3. CloudFront Function (reads KVS, returns 302 redirect) RedirectFunction: Type: AWS::CloudFront::Function Properties: Name: !Sub "${AWS::StackName}-fn" AutoPublish: true FunctionConfig: Comment: !Sub "Redirects friendly URLs to OpenSearch Application endpoints (${MappingsVersion})" Runtime: cloudfront-js-2.0 KeyValueStoreAssociations: - KeyValueStoreARN: !GetAtt AppMappingStore.Arn FunctionCode: !Sub | import cf from 'cloudfront'; const kvsHandle = cf.kvs("${AppMappingStore.Id}"); async function handler(event) { var request = event.request; var host = request.headers.host.value; // Extract subdomain prefix (e.g., "app1" from "app1.example.com") var subdomain = host.split('.')[0]; try { var targetUrl = await kvsHandle.get(subdomain); return { statusCode: 302, statusDescription: 'Found', headers: { 'location': { value: targetUrl }, 'cache-control': { value: 'no-cache, no-store, must-revalidate' } } }; } catch (e) { // Key not found - return 404 return { statusCode: 404, statusDescription: 'Not Found', headers: { 'content-type': { value: 'text/html' } }, body: { encoding: 'text', data: '<html><body><h1>Application Not Found</h1><p>No OpenSearch application is mapped to the requested subdomain.</p></body></html>' } }; } } # 4. CloudFront Distribution Distribution: Type: AWS::CloudFront::Distribution DependsOn: Certificate Properties: DistributionConfig: Enabled: true Comment: !Sub "OpenSearch UI Friendly URL for ${DomainName}" Aliases: - !Sub "*.${DomainName}" ViewerCertificate: AcmCertificateArn: !Ref Certificate SslSupportMethod: sni-only MinimumProtocolVersion: TLSv1.2_2021 DefaultCacheBehavior: ViewerProtocolPolicy: redirect-to-https AllowedMethods: - GET - HEAD CachedMethods: - GET - HEAD CachePolicyId: "4135ea2d-6df8-44a3-9df3-4b5a84be39ad" # AWS managed CachingDisabled policy TargetOriginId: dummy-origin FunctionAssociations: - EventType: viewer-request FunctionARN: !GetAtt RedirectFunction.FunctionMetadata.FunctionARN Origins: - Id: dummy-origin DomainName: "example.com" CustomOriginConfig: OriginProtocolPolicy: https-only HttpVersion: http2and3 IPV6Enabled: true PriceClass: PriceClass_All # 5. Wildcard DNS record pointing to CloudFront WildcardDnsRecord: Type: AWS::Route53::RecordSet Properties: HostedZoneId: !Ref HostedZoneId Name: !Sub "*.${DomainName}" Type: A AliasTarget: HostedZoneId: Z2FDTNDATAQYW2 # CloudFront's fixed hosted zone ID (constant for all distributions) DNSName: !GetAtt Distribution.DomainName EvaluateTargetHealth: false Outputs: CloudFrontDomain: Description: "CloudFront distribution domain name" Value: !GetAtt Distribution.DomainName CertificateArn: Description: "ACM Certificate ARN" Value: !Ref Certificate KeyValueStoreArn: Description: "CloudFront KeyValueStore ARN" Value: !GetAtt AppMappingStore.Arn ExampleUrl: Description: "Example friendly URL" Value: !Sub "https://prod.${DomainName}" MappingsFileLocation: Description: "S3 location of your app mappings file" Value: !Sub "s3://${MappingsBucket}/${MappingsKey}" CurrentMappingsVersion: Description: "Current mappings version deployed" Value: !Ref MappingsVersion TemplateVersion: Description: "Template version and last updated date" Value: "1.0.0 (2026-08-05)"
애플리케이션 추가 또는 제거
애플리케이션 매핑을 추가, 업데이트 또는 제거하려면 새 버전의 S3 매핑 파일을 생성하고 스택을 새 버전으로 업데이트합니다. 버전이 지정된 접근 방식은 S3 파일을 신뢰할 수 있는 소스로 유지하며 언제든지 새 구성으로 롤백하거나 이전 버전으로 롤백할 수 있습니다.
-
매핑 파일을 편집하여 항목을 추가하거나 제거합니다. 증분 버전 접미사(예: )와 함께 저장합니다
opensearch-ui-friendly-url-app-mappings-v2.json. -
새 버전을 S3에 업로드합니다.
aws s3 cp opensearch-ui-friendly-url-app-mappings-v2.json \ s3://your-bucket-name/opensearch-ui-friendly-url-app-mappings-v2.json -
새
MappingsKey및 로 스택을 업데이트합니다MappingsVersion.콘솔 사용: CloudFormation 콘솔
을 열고 스택을 선택한 다음 업데이트를 선택하고 현재 템플릿 사용을 선택한 다음 MappingsKey및MappingsVersion파라미터를 새 값으로 업데이트합니다.AWS CLI 사용:
aws cloudformation update-stack \ --stack-name opensearch-ui-friendly-url \ --use-previous-template \ --parameters \ ParameterKey=DomainName,UsePreviousValue=true \ ParameterKey=HostedZoneId,UsePreviousValue=true \ ParameterKey=MappingsBucket,UsePreviousValue=true \ ParameterKey=MappingsKey,ParameterValue=opensearch-ui-friendly-url-app-mappings-v2.json \ ParameterKey=MappingsVersion,ParameterValue=v2 \ --region us-east-1
중요
매핑을 업데이트할 때마다 MappingsVersion 파라미터를 변경해야 합니다. 버전은 KeyValueStore 이름을 구동하여 KeyValueStore를 업데이트된 데이터로 대체 CloudFormation 하도록 트리거합니다. 명확성을 위해 MappingsKey 파일 이름과를 동기화MappingsVersion(예: ...-v2.json와 동기화MappingsVersion=v2)된 상태로 유지합니다.
이전 버전으로 롤백하려면 이전 파일 및 버전을 가리키는 스택을 업데이트합니다.
콘솔 사용: CloudFormation 콘솔v1)으로 MappingsKey MappingsVersion 돌아갑니다.
AWS CLI 사용:
aws cloudformation update-stack \ --stack-name opensearch-ui-friendly-url \ --use-previous-template \ --parameters \ ParameterKey=DomainName,UsePreviousValue=true \ ParameterKey=HostedZoneId,UsePreviousValue=true \ ParameterKey=MappingsBucket,UsePreviousValue=true \ ParameterKey=MappingsKey,ParameterValue=opensearch-ui-friendly-url-app-mappings-v1.json \ ParameterKey=MappingsVersion,ParameterValue=v1 \ --region us-east-1
이 버전 관리형 접근 방식을 사용하면 S3 파일을 각 구성 버전의 최종 레코드로 유지하면서 필요에 따라 애플리케이션 매핑을 롤포워드하거나 롤백할 수 있는 완전한 제어가 가능합니다.
Route 53 없이 설정(수동 구성)
도메인이 Route 53 이외의 DNS 공급자에 의해 관리되는 경우 AWS 관리 콘솔에서 친숙한 URL 리디렉션을 수동으로 설정할 수 있습니다. 이 접근 방식은 매핑에 Amazon S3를 사용하지 않습니다. CloudFront 콘솔에서 직접 키-값 페어를 관리합니다.
Route 53 없이 친숙한 URL 리디렉션을 설정하려면
-
ACM에서 인증서 요청
-
us-east-1리전의 https://console.aws.amazon.com/acm/ACM 콘솔을 엽니다. -
인증서 요청을 선택합니다.
-
도메인 이름에
*.(와일드카드 인증서)를 입력합니다.your-domain.com -
검증 방법에서 DNS 검증을 선택합니다.
-
요청을 선택합니다.
-
인증서 세부 정보 페이지의 도메인 검증 아래에 CNAME 레코드 이름과 값을 기록해 둡니다. DNS 공급자에서이 CNAME 레코드를 생성하여 도메인 소유권을 검증합니다.
-
인증서 상태가 발급됨으로 변경될 때까지 기다립니다(일반적으로 DNS 레코드 생성 후 5~30분).
-
-
CloudFront KeyValueStore 생성
-
https://console.aws.amazon.com/cloudfront/
에서 CloudFront 콘솔을 엽니다. -
탐색 창에서 함수를 선택합니다. 그런 다음 KeyValueStores 탭을 선택합니다.
-
KeyValueStore 생성 버튼을 선택합니다.
-
이름(예:
opensearch-ui-friendly-url-app-mappings-store)을 입력합니다. -
생성(Create)을 선택합니다.
-
생성 후 편집을 선택하여 키-값 페어를 추가합니다. 각 애플리케이션에 대해 키(와 같은 하위 도메인 이름
prod)와 값(전체 OpenSearch UI 애플리케이션 URL)을 추가합니다.
-
-
CloudFront 함수 생성
-
https://console.aws.amazon.com/cloudfront/
에서 CloudFront 콘솔을 엽니다. -
탐색 창에서 함수를 선택합니다.
-
함수 탭에서 함수 생성을 선택합니다.
-
함수의 이름을 입력합니다(예:
opensearch-ui-friendly-url-redirect-function). -
런타임에서 cloudfront-js-2.0을 선택합니다.
-
함수 코드를 다음으로 바꿉니다.
import cf from 'cloudfront'; const kvsHandle = cf.kvs("YOUR_KVS_ID"); async function handler(event) { var request = event.request; var host = request.headers.host.value; var subdomain = host.split('.')[0]; try { var targetUrl = await kvsHandle.get(subdomain); return { statusCode: 302, statusDescription: 'Found', headers: { 'location': { value: targetUrl }, 'cache-control': { value: 'no-cache, no-store, must-revalidate' } } }; } catch (e) { return { statusCode: 404, statusDescription: 'Not Found', headers: { 'content-type': { value: 'text/html' } }, body: { encoding: 'text', data: '<html><body><h1>Application Not Found</h1><p>No OpenSearch application is mapped to the requested subdomain.</p></body></html>' } }; } }YOUR_KVS_ID를 생성한 KeyValueStore의 ID로 바꿉니다(KeyValueStore 세부 정보 페이지에서 볼 수 있음). -
KeyValueStore 연결에서 생성한 KeyValueStore를 연결합니다.
-
변경 사항 저장을 선택한 다음 함수 게시를 선택합니다.
-
-
CloudFront 배포 생성
-
CloudFront 콘솔에서 배포 생성을 선택합니다.
-
오리진 도메인에 유효한 도메인(예:
example.com)을 입력합니다. 함수가 응답에 도달하기 전에 응답을 반환하기 때문에 오리진에 연결되지 않습니다. -
기본 캐시 동작의 뷰어 프로토콜 정책에서 HTTP를 HTTPS로 리디렉션을 선택합니다.
-
캐시 정책에서 CachingDisabled 선택합니다.
-
함수 연결의 뷰어 요청에서 CloudFront 함수를 선택합니다.
-
설정에서 대체 도메인 이름(CNAMEs)에를 입력합니다
*..your-domain.com -
사용자 지정 SSL 인증서에서 ACM에서 생성한 인증서를 선택합니다.
-
배포 생성을 선택합니다.
-
배포 도메인 이름(예:
d1234abcdef8.cloudfront.net)을 기록해 둡니다.
-
-
공급자에서 DNS 구성
DNS 공급자에서 CloudFront 배포 도메인 이름(예: )
*.을 가리키는 CNAME 레코드를 생성합니다your-domain.comd1234abcdef8.cloudfront.net.참고
일부 DNS 공급자는 와일드카드 CNAME 레코드를 지원하지 않습니다. 이 경우 사용하려는 각 하위 도메인에 대해 개별 CNAME 레코드를 생성합니다(예: ,
prod.your-domain.comstaging.your-domain.com).
애플리케이션 매핑 수동 추가
초기 수동 설정 후 새 애플리케이션 매핑을 추가하려면:
-
https://console.aws.amazon.com/cloudfront/
에서 CloudFront 콘솔을 엽니다. -
탐색 창에서 함수를 선택합니다. 그런 다음 KeyValueStores 탭을 선택합니다.
-
KeyValueStore 이름(예:
opensearch-ui-friendly-url-app-mappings-store)을 선택합니다. -
편집을 선택합니다.
-
페어 추가를 선택합니다. 하위 도메인 이름을 키로 입력하고 전체 OpenSearch UI 애플리케이션 URL을 값으로 입력합니다.
-
변경 사항 저장을 선택합니다.
새 표시 URL은 저장 후 즉시 사용할 수 있습니다.
정리
친숙한 URL 리디렉션 인프라를 제거하려면 다음 명령을 실행합니다.
aws cloudformation delete-stack \ --stack-name opensearch-ui-friendly-url \ --region us-east-1
이 명령은 CloudFront 배포, 함수, KeyValueStore, ACM 인증서 및 DNS 레코드를 제거합니다. OpenSearch UI 애플리케이션에는 영향을 주지 않습니다.
문제 해결
- ACM 인증서는에 유지됩니다.
Pending validation -
도메인의 DNS가 Route 53에 올바르게 위임되었는지(또는 DNS 공급자에서 검증 CNAME을 생성했는지) 확인합니다.
dig를 사용하여 네임서버를 확인합니다.your-domainNS - 브라우저에 인증서 오류가 표시됨
-
ACM 인증서가 도메인을 와일드카드()로 포함하는지 확인합니다
*.your-domain.com. 인증서는us-east-1리전에 있어야 합니다. - 404 애플리케이션을 찾을 수 없음
-
액세스하려는 하위 도메인에 KeyValueStore에 매핑이 없습니다. 키가 매핑 파일에 있는지 확인하고 마지막 변경 후 스택을 업데이트했는지(또는 페어를 수동으로 추가했는지) 확인합니다.
- CloudFront 배포에 15분 이상
Deploying상태 표시 -
CloudFront 배포는 전 세계에 배포하는 데 최대 15분이 걸릴 수 있습니다. 배포 시간이 더 오래 걸리는 경우 CloudFront 콘솔에서 오류 세부 정보를 확인하세요.
- 스택 생성 중에 SourceARN에 액세스할 수 없는 오류입니다.
-
S3 버킷 정책이 매핑 파일을 읽을 수 있는
cloudfront.amazonaws.com권한을 부여하는지 확인합니다. 또한 스택을 배포하는 IAM 역할에 버킷에 대한s3:GetObject,s3:HeadObject및s3:GetBucketLocation권한이 있는지 확인합니다.