View a markdown version of this page

OpenSearch UI アプリケーションのフレンドリ URL の設定 (セルフサービス) - Amazon OpenSearch Service

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

OpenSearch UI アプリケーションのフレンドリ URL の設定 (セルフサービス)

OpenSearch UI アプリケーションには、 のような自動生成された URLs がありますhttps://application-name-id.Region.opensearch.amazonaws.com。これらの URLsは長く、覚えにくいです。わかりやすい URL ( などhttps://prod.example.com) を設定できます。この URL はアプリケーションにリダイレクトされるため、 AWS マネジメントコンソールを移動せずにダッシュボードに直接アクセスできます。

仕組み

このソリューションでは、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 を検索し、ブラウザをリダイレクトします。アプリケーションは認証を直接処理します。

前提条件

  • エンドポイント URLs を持つ 1 つ以上の OpenSearch UI アプリケーション。

  • 所有しているドメイン名 (例: example.com)。

  • ドメインの Route 53 のパブリックホストゾーン。お持ちでない場合は、「」を参照してくださいRoute 53 を使用しないセットアップ (手動設定)

  • アプリケーション URL マッピングファイルを保存する Amazon S3 バケット。

を使用してデプロイする AWS CloudFormation

テンプレートを使用してわかりやすい URL リダイレクトインフラストラクチャをデプロイするには、次の手順に従います CloudFormation 。

OpenSearch UI アプリケーションのフレンドリ URL を設定するには
  1. フレンドリ名をアプリケーション 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 サフィックスは、これをマッピングの最初のバージョンとして識別します。マッピングを更新すると、このバージョンが増加します。

  2. マッピングファイルをアカウントの 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
  3. バケットポリシーを追加してマッピングファイルを読み取るアクセス許可を CloudFront に付与します。your-bucket-nameyour-account-id を自分の値に置き換えます。

    aws s3api put-bucket-policy \ --bucket your-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 にアクセスできません」というエラーで失敗します。

  4. 次のいずれかのオプションを使用して 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&param_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
  5. CLI (オプション 2) AWS を使用した場合は、 us-east-1リージョンにスタックをデプロイします。CloudFront では、ACM 証明書が にある必要がありますus-east-1。OpenSearch UI アプリケーションは、OpenSearch UI でサポートされている任意のリージョンとクォータに配置できます。

  6. スタックが完了するまで待ちます (約 15 分)。進行状況をモニタリングできます。

    aws cloudformation wait stack-create-complete \ --stack-name opensearch-ui-friendly-url \ --region us-east-1
  7. リダイレクトをテストします。ブラウザを開き、 に移動しますhttps://prod.your-domain.com。OpenSearch UI アプリケーションにリダイレクトされます。

    で検証することもできますcurl

    curl -I https://prod.your-domain.com # Expected: HTTP/2 302 # location: https://application-prod-abc123.us-west-2.opensearch.amazonaws.com

以下は、上記の Launch Stack リンクと 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 ファイルを信頼できるソースとして保持し、いつでも新しい設定にロールフォワードしたり、以前のバージョンにロールバックしたりできます。

  1. マッピングファイルを編集して、エントリを追加または削除します。増分バージョンサフィックス (例: ) で保存しますopensearch-ui-friendly-url-app-mappings-v2.json

  2. 新しいバージョンを S3 にアップロードします。

    aws s3 cp opensearch-ui-friendly-url-app-mappings-v2.json \ s3://your-bucket-name/opensearch-ui-friendly-url-app-mappings-v2.json
  3. 新しい MappingsKeyと でスタックを更新しますMappingsVersion

    コンソールの使用: CloudFormation コンソールを開き、スタックを選択し、更新を選択し、現在のテンプレートを使用するを選択し、 パラメータMappingsKeyMappingsVersionパラメータを新しい値で更新します。

    CLI AWS の使用:

    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ファイル名と を ( など...-v2.jsonMappingsVersion=v2) MappingsVersion同期させます。

以前のバージョンにロールバックするには、以前のファイルとバージョンを指すスタックを更新します。

コンソールの使用: CloudFormation コンソールを開き、スタックを選択し、更新を選択し、現在のテンプレートを使用するを選択し、 MappingsKey を設定して前の値MappingsVersionに戻します (例: v1)。

CLI AWS の使用:

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 リダイレクトを設定するには
  1. ACM で証明書をリクエストする
    1. us-east-1 リージョンの https://console.aws.amazon.com/acm/ で ACM コンソールを開きます。

    2. 証明書のリクエストを選択します。

    3. ドメイン名には、 *.your-domain.com (ワイルドカード証明書) と入力します。

    4. 検証方法では、DNS 検証を選択します。

    5. [リクエスト] を選択します。

    6. 証明書の詳細ページで、ドメイン検証で CNAME レコード名と値を書き留めます。DNS プロバイダーでこの CNAME レコードを作成して、ドメインの所有権を検証します。

    7. 証明書のステータスが発行済み (通常は DNS レコードの作成から 5~30 分後) に変わるまで待ちます。

  2. CloudFront KeyValueStore を作成する
    1. CloudFront コンソール (https://console.aws.amazon.com/cloudfront/) を開きます。

    2. ナビゲーションペインで、[関数] を選択します。次に、KeyValueStores タブを選択します。

    3. [KeyValueStore を作成] を選択します。

    4. 名前を入力します (例: opensearch-ui-friendly-url-app-mappings-store)。

    5. [作成] を選択します。

    6. 作成後、編集 を選択してキーと値のペアを追加します。アプリケーションごとに、キー ( などのサブドメイン名prod) と値 (完全な OpenSearch UI アプリケーション URL) を追加します。

  3. CloudFront 関数を作成する
    1. CloudFront コンソール (https://console.aws.amazon.com/cloudfront/) を開きます。

    2. ナビゲーションペインで、[関数] を選択します。

    3. Functions タブで、Create function を選択します。

    4. 関数の名前を入力します (例: opensearch-ui-friendly-url-redirect-function)。

    5. Runtimecloudfront-js-2.0 を選択します。

    6. 関数コードを以下に置き換えます。

      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 の詳細ページを参照)。

    7. KeyValueStore の関連付けで、作成した KeyValueStore を関連付けます。

    8. 変更を保存 を選択し、関数をパブリッシュします。

  4. CloudFront ディストリビューションを作成する
    1. CloudFront コンソールで、ディストリビューションの作成を選択します。

    2. オリジンドメインには、有効なドメイン ( などexample.com) を入力します。関数は、オリジンに到達する前にレスポンスを返すため、オリジンには連絡されません。

    3. デフォルトのキャッシュ動作ビューワープロトコルポリシーで、HTTP を HTTPS にリダイレクトを選択します

    4. キャッシュポリシーで、CachingDisabled を選択します。

    5. 関数の関連付けで、ビューワーリクエストで CloudFront 関数を選択します。

    6. 「設定」の「代替ドメイン名 (CNAMEs「」と入力します*.your-domain.com

    7. カスタム SSL 証明書の場合は、ACM で作成した証明書を選択します。

    8. [ディストリビューションの作成] を選択します。

    9. ディストリビューションドメイン名 ( などd1234abcdef8.cloudfront.net) を書き留めます。

  5. プロバイダーで DNS を設定する

    DNS プロバイダーで、CloudFront ディストリビューションドメイン名 ( などd1234abcdef8.cloudfront.net) *.your-domain.comを指す CNAME レコードを作成します。

    注記

    一部の DNS プロバイダーは、ワイルドカード CNAME レコードをサポートしていません。この場合、使用するサブドメインごとに個別の CNAME レコードを作成します (例: prod.your-domain.comstaging.your-domain.com)。

アプリケーションマッピングを手動で追加する

最初の手動セットアップ後に新しいアプリケーションマッピングを追加するには:

  1. CloudFront コンソール (https://console.aws.amazon.com/cloudfront/) を開きます。

  2. ナビゲーションペインで、[関数] を選択します。次に、KeyValueStores タブを選択します。

  3. KeyValueStore 名 ( などopensearch-ui-friendly-url-app-mappings-store) を選択します。

  4. [編集] を選択します。

  5. ペアの追加 を選択します。キーとしてサブドメイン名を入力し、値として完全な OpenSearch UI アプリケーション URL を入力します。

  6. [Save changes] (変更の保存) をクリックします。

新しいフレンドリ 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-domain NS を使用してネームサーバーを検証します。

ブラウザに証明書エラーが表示される

ACM 証明書がドメインをワイルドカード () としてカバーしていることを確認します*.your-domain.com。証明書は us-east-1リージョンにある必要があります。

404 アプリケーションが見つかりません

アクセスしようとしているサブドメインに KeyValueStore にマッピングがありません。キーがマッピングファイルに存在することを確認し、前回の変更後にスタックを更新した (またはペアを手動で追加した) ことを確認します。

CloudFront ディストリビューションに 15 分以上Deployingのステータスが表示される

CloudFront ディストリビューションがグローバルにデプロイされるまでに最大 15 分かかる場合があります。デプロイに時間がかかる場合は、CloudFront コンソールでエラーの詳細を確認してください。

スタックの作成中に SourceARN にアクセスできないエラー

S3 バケットポリシーがマッピングファイルを読み取るcloudfront.amazonaws.comアクセス許可を付与していることを確認します。また、スタックをデプロイする IAM ロールに、バケットに対する s3:GetObjects3:HeadObject、および アクセスs3:GetBucketLocation許可があることを確認します。