

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

# OpenSearch UI アプリケーションのフレンドリ URL の設定 (セルフサービス)
<a name="application-custom-domain"></a>

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

## 仕組み
<a name="application-custom-domain-overview"></a>

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

## 前提条件
<a name="application-custom-domain-prerequisites"></a>
+ エンドポイント URLs を持つ 1 つ以上の OpenSearch UI アプリケーション。
+ 所有しているドメイン名 (例: `example.com`)。
+ ドメインの Route 53 のパブリックホストゾーン。お持ちでない場合は、「」を参照してください[Route 53 を使用しないセットアップ (手動設定)](#application-custom-domain-without-route53)。
+ アプリケーション URL マッピングファイルを保存する Amazon S3 バケット。

## を使用してデプロイする AWS CloudFormation
<a name="application-custom-domain-deploy-cfn"></a>

テンプレートを使用してわかりやすい 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` サフィックスは、これをマッピングの最初のバージョンとして識別します。マッピングを更新すると、このバージョンが増加します。

1. マッピングファイルをアカウントの 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
   ```

1. バケットポリシーを追加してマッピングファイルを読み取るアクセス許可を CloudFront に付与します。{{your-bucket-name}} と {{your-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 にアクセスできません」というエラーで失敗します。

1. 次のいずれかのオプションを使用して 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
   ```

1. CLI (オプション 2) AWS を使用した場合は、 `us-east-1`リージョンにスタックをデプロイします。CloudFront では、ACM 証明書が にある必要があります`us-east-1`。OpenSearch UI アプリケーションは、[OpenSearch UI でサポートされている任意のリージョンとクォータに配置](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/opensearch-ui-endpoints-quotas.html)できます。

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

   ```
   aws cloudformation wait stack-create-complete \
     --stack-name opensearch-ui-friendly-url \
     --region us-east-1
   ```

1. リダイレクトをテストします。ブラウザを開き、 に移動します`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
   ```

### CloudFormation テンプレートソース
<a name="application-custom-domain-template-source"></a>

以下は、上記の 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)"
```

### アプリケーションの追加または削除
<a name="application-custom-domain-add-apps"></a>

アプリケーションマッピングを追加、更新、または削除するには、S3 マッピングファイルの新しいバージョンを作成し、新しいバージョンでスタックを更新します。バージョニングアプローチでは、S3 ファイルを信頼できるソースとして保持し、いつでも新しい設定にロールフォワードしたり、以前のバージョンにロールバックしたりできます。

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

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

   ```
   aws s3 cp opensearch-ui-friendly-url-app-mappings-v2.json \
     s3://{{your-bucket-name}}/opensearch-ui-friendly-url-app-mappings-v2.json
   ```

1. 新しい `MappingsKey`と でスタックを更新します`MappingsVersion`。

   **コンソールの使用:** [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)を開き、スタックを選択し、**更新**を選択し、**現在のテンプレートを使用する**を選択し、 パラメータ`MappingsKey`と `MappingsVersion`パラメータを新しい値で更新します。

   **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.json`で`MappingsVersion=v2`) `MappingsVersion`同期させます。

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

**コンソールの使用:** [CloudFormation コンソール](https://console.aws.amazon.com/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 を使用しないセットアップ (手動設定)
<a name="application-custom-domain-without-route53"></a>

ドメインが Route 53 以外の DNS プロバイダーによって管理されている場合は、 AWS マネジメントコンソールでフレンドリ URL リダイレクトを手動で設定できます。このアプローチでは、マッピングに Amazon S3 を使用しません。CloudFront コンソールでキーと値のペアを直接管理します。

**Route 53 を使用せずにわかりやすい URL リダイレクトを設定するには**

1. 

**ACM で証明書をリクエストする**

   1. `us-east-1` リージョンの [https://console.aws.amazon.com/acm/](https://console.aws.amazon.com/acm/) で ACM コンソールを開きます。

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

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

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

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

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

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

1. 

**CloudFront KeyValueStore を作成する**

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

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

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

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

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

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

1. 

**CloudFront 関数を作成する**

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

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

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

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

   1. **Runtime** で **cloudfront-js-2.0** を選択します。

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

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

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

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

1. 

**CloudFront ディストリビューションを作成する**

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

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

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

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

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

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

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

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

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

1. 

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

   DNS プロバイダーで、CloudFront ディストリビューションドメイン名 ( など`d1234abcdef8.cloudfront.net`) `*.{{your-domain.com}}`を指す CNAME レコードを作成します。
**注記**  
一部の DNS プロバイダーは、ワイルドカード CNAME レコードをサポートしていません。この場合、使用するサブドメインごとに個別の CNAME レコードを作成します (例: `prod.your-domain.com`、`staging.your-domain.com`)。

### アプリケーションマッピングを手動で追加する
<a name="application-custom-domain-manual-add-apps"></a>

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

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

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

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

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

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

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

新しいフレンドリ URL は、保存後すぐに使用できます。

## クリーンアップ
<a name="application-custom-domain-cleanup"></a>

わかりやすい URL リダイレクトインフラストラクチャを削除するには、次のコマンドを実行します。

```
aws cloudformation delete-stack \
  --stack-name opensearch-ui-friendly-url \
  --region us-east-1
```

このコマンドは、CloudFront ディストリビューション、 関数、KeyValueStore、ACM 証明書、DNS レコードを削除します。OpenSearch UI アプリケーションには影響しません。

## トラブルシューティング
<a name="application-custom-domain-troubleshooting"></a>

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:GetObject`、`s3:HeadObject`、および アクセス`s3:GetBucketLocation`許可があることを確認します。