CloudFront ディストリビューションに CNAME エイリアスを設定したときに発生する CNameAlreadyExists エラーを解決する方法を教えてください。

所要時間2分
0

Amazon CloudFront ディストリビューションに Canonical Name record (CNAME) エイリアスを設定すると、「CNameAlreadyExists」というエラーが表示されます。

簡単な説明

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

「指定した 1 つ以上の CNAME は、すでに別のリソースに関連付けられています。(サービス: AmazonCloudFront; ステータスコード: 409; エラーコード: CNAME はすでに存在しています。リクエスト ID: a123456b-c78d-90e1-23f4-gh5i67890jkl*"

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

**注:**CNAME を手動で関連付ける場合は、続行する前に、古いディストリビューションのステータスが Deployed になるまで待つ必要がある場合があります。

ディストリビューション ID がわからない場合は、ListConflictingAliases CloudFront API を使用してください。これにより、ディストリビューションに関する部分的な情報と、競合している CNAME エイリアスのアカウント ID を検索できます。次に、AssociateAlias API を使用して CNAME を既存のディストリビューション (ソースディストリビューション) から新しいディストリビューション (ターゲットディストリビューション) に移動します。シナリオに応じて、次のいずれかの解決策を使用してください:

  • 同じアカウントにあるソースディストリビューションとターゲットディストリビューションについては、「AssociateAlias API を使用して CNAME を移動する」セクションを参照してください。
  • クロスアカウントのソースディストリビューションとターゲットディストリビューションについては、「CNAME が競合しているソースディストリビューションを無効にする」セクションを参照してください。
  • 既存のトラフィックのダウンタイムが原因でソースディストリビューションを無効にできない場合は、「ワイルドカードを使用して代替ドメイン名を移動する」を参照してください。
    **注:**ワイルドカードを使用して Apex ドメイン (example.com) を移動することはできません。ソースとターゲットのディストリビューションが異なる AWS アカウントにある場合に Apex ドメインを移動するには、AWS サポートに連絡して別のドメイン名に移動してください

解決策

AssociateAlias API を使用して CNAME を移動します

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

1.API リクエストを行うユーザーまたはロールの AWS Identity and Access Management (IAM) ポリシーに、次のリソースレベルの権限を追加します:

重要: リクエストを行う 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"
      ]
    }
  ]
}

**注:**SourceAccount をソースディストリビューションの AWS アカウント番号に置き換えてください。SourceDistroID をソースディストリビューション ID に置き換えてください。TargetAccountID をターゲットディストリビューションの AWS アカウント番号に置き換えてください。TargetDistroID をターゲットディストリビューション ID に置き換えてください。

2.CNAME が競合しているディストリビューションを特定します。CNAME が競合しているディストリビューションがわからない場合は、ListConflictingAliases API を使用してそのディストリビューションを探してください:

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

**注:**YourDistributionID をディストリビューションの ID に置き換えてください。YourCNAME を競合する CNAME エイリアスに置き換えてください。

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

所有権を確認する準備ができたら、ターゲットディストリビューションの正規名に解決される 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 の CA 証明書リストまたは AWS 証明書マネージャーに記載されている信頼できる CA から有効な証明書を発行してもらうのがベストプラクティスです。

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

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

CNAME が競合しているソースディストリビューションを無効にする

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

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

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

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

3.ソースディストリビューションを選択し、[無効化] を選択します。

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 サポートにお問い合わせください

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

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

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

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.CNAME の DNS レコードを検証するには、dig または同様の DNS クエリツールを使用してください:

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

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

AWS公式
AWS公式更新しました 1年前