CloudFront ディストリビューションで CNAME エイリアスを設定する際に、CNAMEAlreadyExists エラーを解決するにはどうすればよいですか?

最終更新日: 2022 年 9 月 22 日

Amazon CloudFront ディストリビューションに Canonical Name Record (CNAME) エイリアスを設定すると、「CNAMEAlreadyExists」エラーが発生します。これを解決するにはどうすればよいですか?

簡単な説明

CNAMEAlreadyExists エラーは、追加しようとしている CNAME エイリアスが既に別の CloudFront ディストリビューションに関連付けられている場合に発生します。複数の CloudFront ディストリビューションに対して同じ CNAME エイリアスを使用することはできません。エラーは次のようになります。

One or more of the CNAMEs you provided are already associated with a different resource. (Service: AmazonCloudFront; Status Code: 409; Error Code: CNAMEAlreadyExists; Request ID: a123456b-c78d-90e1-23f4-gh5i67890jkl*

ソースディストリビューションとターゲットディストリビューションの両方にアクセスできる場合は、まず、既存の CloudFront ディストリビューションから CNAME の関連付けを手動で削除します。その後、CNAME を新しい CloudFront ディストリビューションに関連付けます。

: CNAME を手動で関連付けると、古いディストリビューションのステータスが [Deployed] (デプロイ済み) になるまで CNAME を新しいディストリビューションに関連付けることができない場合があります。

ディストリビューション ID がわからない場合は、ListConflictingAliases CloudFront API を使用して、競合している CNAME エイリアスのディストリビューションとアカウント ID に関する部分的な情報を確認します。その後、AssociateAlias API を使用して CNAME を既存のディストリビューション (ソースディストリビューション) から新しいディストリビューション (ターゲットディストリビューション) に移行します。シナリオに応じて、次の解決方法のいずれかを選択してください。

  • ソースディストリビューションとターゲットディストリビューションが同じアカウント上にある場合は、「AssociateAlias API を使用して CNAME を移行する」セクションのステップを完了します。
  • ソースディストリビューションとターゲットディストリビューションが異なる AWS アカウントにある場合は、「競合する CNAME でソースディストリビューションを非アクティブ化する」セクションのステップを完了します。
  • ソースディストリビューションとターゲットディストリビューションが異なる AWS アカウントにあり、既存のトラフィックのダウンタイムのためにソースディストリビューションを非アクティブ化できない場合は、「ワイルドカードを使用して代替ドメイン名を移行する」セクションのステップを完了します。

解決方法

AssociateAlias API を使用して CNAME を移行する

: AWS コマンドラインインターフェイス (AWS CLI) のコマンド実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用するようにしてください

1.    API リクエストを実行するユーザーまたはロールの AWS Identity and Access Management (IAM) ポリシーで、次のリソースレベルの許可を追加します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CloudFrontCnameSwapSameAcc",
      "Effect": "Allow",
      "Action": [
        "cloudfront:GetDistribution",
        "cloudfront:ListConflictingAliases",
        "cloudfront:AssociateAlias",
        "cloudfront:UpdateDistribution"
      ],
      "Resource": [
        "arn:aws:cloudfront::SourceAcccount:distribution/SourceDistroID",
        "arn:aws:cloudfront::TargetAccount:distribution/TargetDistroID"
      ]
    }
  ]
}

重要: リクエストを行う IAM ユーザーまたはロールには、ソースディストリビューションとターゲットディストリビューションの両方の IAM ポリシーで前述のリソースレベルの許可が必要です。

: SourceAcccount を、ソースディストリビューションの AWS アカウント番号に置き換えます。SourceDistroID を、ソースディストリビューション ID に置き換えます。TargetAccountID を、ターゲットディストリビューションの AWS アカウント番号に置き換えます。TargetDistroID を、ターゲットディストリビューション ID に置き換えます。

2.    競合する CNAME があるディストリビューションを特定します。どのディストリビューションに競合する CNAME があるかわからない場合は、ListConflictingAliases API を使用してそのディストリビューションを特定します。YourDistributionID を、ご利用のディストリビューションの ID に置き換えます。YourCNAME を、競合する CNAME エイリアスに置き換えます。

$ aws cloudfront list-conflicting-aliases --distribution-id YourDistributionID --alias YourCNAME

注: 所有権を確認するには、YourDistributionID への読み取りアクセス権が必要です。また、競合する CNAME を保護する CloudFront ディストリビューションに関連付けられた SSL 証明書が必要です。

3.    ターゲットディストリビューションの正規名を解決する CNAME の DNS TXT レコードを作成して、ドメインの所有権を確認します。TXT レコードには、CNAME、Apex、またはワイルドカードの前にアンダースコアを含める必要があります。例:

_.example.com.         900   IN   TXT     "dexample123456.cloudfront.net"
_cname.example.com.    900   IN   TXT     "dexample123456.cloudfront.net"
_*.example.com.        900   IN   TXT     "dexample123456.cloudfront.net"

4.    ターゲットディストリビューションに有効な SSL 証明書があることを確認します。
注: サブジェクト名またはサブジェクト代替名は、指定された CNAME エイリアスと一致、または重複している必要があります。Mozilla の wiki の CA 証明書リストまたは AWS Certificate Manager に掲載されている、信頼できる CA から発行された有効な証明書を入手するのがベストプラクティスです。

5.    ターゲットディストリビューションを所有するアカウントから AssociateAlias API リクエストを実行します。

$ aws cloudfront associate-alias --target-distribution-id YourTargeDistributiontID --alias your_cname.example.com

競合する CNAME を含むソースディストリビューションを非アクティブ化する

ソースディストリビューションとターゲットディストリビューションが異なる AWS アカウントにある場合は、まず、競合するドメインに関連付けられているソースディストリビューションを無効にします。その後、AssociateAlias API を使用して CNAME を移行します。

Apex ドメインは、associate-alias コマンドを使用して異なる AWS アカウント間で移行することもできます。

1.    CloudFront コンソールを開きます。

2.    ナビゲーションペインで、[Distributions] (ディストリビューション) を選択します。

3.    ソースディストリビューションを選択してから、[Disable] (無効) を選択します。
どのディストリビューションに競合する CNAME があるかわからない場合は、ListConflictingAliases API を使用してそのディストリビューションを特定します。必ず YourDistributionID をご利用のディストリビューションの ID に、YourCNAME を競合する CNAME の名前に置き換えてください。

$ aws cloudfront list-conflicting-aliases --distribution-id YourDistributionID --alias YourCNAME

: ListConflictingAliases API には、GetDistribution 許可と ListConflictingAliases 許可が必要です。

ソースディストリビューションを非アクティブ化した後、「AssociateAlias API を使用して CNAME を移行する」セクションのステップに従います。

ソースディストリビューションの AWS アカウントにアクセスできない場合、またはソースディストリビューションを非アクティブ化できない場合は、AWS サポートまでお問い合わせください

ワイルドカードを使用して代替ドメイン名を移行する

ソースディストリビューションとターゲットディストリビューションが異なる AWS アカウントにあるが、ソースディストリビューションを非アクティブ化できない場合は、ワイルドカードを使用して CNAME を移行します。このプロセスでは、ソースディストリビューションとターゲットディストリビューションの両方にアクセスできる必要があります。

: ワイルドカードを使用して apex ドメイン (example.com) を移行することはできません。ソースディストリビューションとターゲットディストリビューションが異なる AWS アカウントにある場合に apex ドメインを移行するには、AWS サポートに問い合わせて代替ドメイン名を移行してください

重要: このプロセスには、ソースディストリビューションとターゲットディストリビューションの両方に対する複数の更新が含まれます。各ディストリビューションが最新の変更を完全にデプロイするのを待ってから、次のステップに進みます。

1.    ターゲットディストリビューションを更新して、移行する代替ドメイン名をカバーするワイルドカード CNAME を追加します。ドメインが www.example.com の場合は、ワイルドカード代替ドメイン名 *.example.com をターゲットディストリビューションに追加します。

注: ターゲットディストリビューションには、ワイルドカードドメイン名を保護する SSL/TLS 証明書が必要です

2.    ターゲットディストリビューションの正規名をポイントするように CNAME の DNS 設定を更新します。ドメインが www.example.com の場合は、www.example.com の DNS レコードを更新して、トラフィックをターゲットディストリビューションの正規名にルーティングします。例:

www.example.com.         86400   IN   CNAME     "dexample123456.cloudfront.net"

: DNS 設定を更新した後でも、代替ドメイン名を使用するリクエストはソースディストリビューションによって提供されます。これは、代替ドメイン名がまだソースディストリビューションに関連付けられているためです。

3.    ソースディストリビューションを更新して、代替ドメイン名を削除します。
: このステップでは、ライブトラフィックが中断されることはありません。リクエストされたドメイン名がターゲットディストリビューションに追加されたワイルドカードドメインと一致するため、ライブトラフィックはターゲットディストリビューション設定を使用します。

4.    ターゲットディストリビューションを更新して、移行する代替ドメイン名を追加します。

5.    dig または類似の DNS クエリツールを使用して、CNAME の DNS レコードを検証します。例:

dig CNAME www.example.com +short
nslookup example.com

6.    (オプション) ターゲットディストリビューションを更新して、ワイルドカード代替ドメイン名を削除します。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?