CloudFrontのCNAMEAlreadyExistsエラーを解決するフローチャート(2021年夏版)

2021.07.09

Amazon CloudFrontはディストリビューション間のCNAMEの重複が許可されていません(CNAMEAlreadyExists エラー)。

この CNAMEAlreadyExists エラーを回避するために

  • ユーザー自身で回避する方法
  • AWSサポートと連携して回避する方法

など、様々なアプローチが存在します。

最近のCloudFrontの仕様変更、API追加により、ユーザー自身で回避できるケースが大幅に増えましたので、最新のパターン別の回避方法を紹介します。

回避フロー

重複対象のディストリビューションを調査

CNAMEAlreadyExists エラーの原因となったディストリビューションがどこに存在するのか知りたい時があります。

そのような場合は CloudFront::ListConflictingAliases API を利用します。

指定したCNAME(エイリアス)とオーバーラップしたCNAMEを持つディストリビューションの

  • AWSアカウントID
  • ディストリビューションID

情報を一部「*」でマスクされた状態で取得できます。 レスポンスに「AWSアカウントID」が含まれていることからわかるように、AWSアカウントをまたいだ情報を取得します。

重複の原因となるディストリビューションを特定し、CNAMEを付け替えてもよいか確認しましょう。

検索条件にワイルドカード型のCNAMEを利用すると、サブドメインの深さが同じCNAMEの一覧を抽出できます。

# ワイルドカードエイリアスを指定
$ aws cloudfront list-conflicting-aliases \
  --distribution-id XXX \
  --alias '*.example.co'
{
    "ConflictingAliasesList": {
        "MaxItems": 100,
        "Quantity": 3,
        "Items": [
            {
                "Alias": "www.example.co",
                "DistributionId": "******QB925RI",
                "AccountId": "******111111"
            },
            {
                "Alias": "*.example.co",
                "DistributionId": "*******7XRY8HY",
                "AccountId": "******111111"
            },
            {
                "Alias": "dummy.example.co",
                "DistributionId": "*******9NZA14E",
                "AccountId": "******222222"
            }
        ]
    }
}

# 明示的なエイリアスを指定
$ aws cloudfront list-conflicting-aliases \
  --distribution-id YYY \
  --alias 'www.example.co'
{
    "ConflictingAliasesList": {
        "MaxItems": 100,
        "Quantity": 2,
        "Items": [
            {
                "Alias": "www.example.co",
                "DistributionId": "******QB925RI",
                "AccountId": "******111111"
            },
            {
                "Alias": "*.example.co",
                "DistributionId": "*******7XRY8HY",
                "AccountId": "******111111"
            }
        ]
    }
}

アカウントIDとディストリビューションIDの前半部分が「*」でマスクされています。 これはブログ向けの加工ではなく、API のレスポンスそのままです。

過去には、ワイルドカード形式のCNAME(*.example.com)を設定すると、他のAWSアカウントで重複(CNAMEAlreadyExists)エラーが発生してCNAMEを指定できないという制約がありましたが、現在はなくなっています。

より気楽にワイルドカードCNAMEを利用できるようになりました。

CloudFront::AssociateAlias API でアトミックに付け替え

  • ディストリビューションが属するAWSアカウントが同じ
  • ディストリビューションが属するAWSアカウントが別で移行元の状態がdisabled

の場合、CloudFront::AssociateAlias API を利用することで、ダウンタイム無しにアトミックにCNAMEを付け替えられます。

以下の流れで作業します。

  1. DNS TXTレコードを作成し、ドメインと移行先ディストリビューションの所有者であることを示す
  2. CloudFront::AssociateAlias API を実行

詳細は以下のドキュメントを参照ください。

ワイルドカードCNAMEを経由して付け替え

  • ディストリビューションが属するAWSアカウントが別で対象のCNAMEが非APEX形式

の場合、ワイルドカード型のCNAMEを経由して付け替えられます。

切り替えのタイミングをユーザーがコントロールできる一方で、手順は少し複雑です。

以下の流れで作業します。

  1. 移行先ディストリビューションのCNAMEをワイルドカード形式(*.example.com)で指定
  2. 移行元ディストリビューションのCNAMEから移行するCNAME(www.example.com)を削除
  3. 移行先ディストリビューションのCNAMEをワイルドカード形式(*.example.com)から具体的なもの(www.example.com)に変更

詳細は以下のドキュメントを参照ください。

AWSサポートと連携

クロスアカウントにAPEX CNAMEを付け替える場合、AWSと協調します。

この場合、ユーザーは切り替えタイミングをコントロールできません。

以下の流れで作業します。

  1. ユーザーがDNS TXTレコードを作成し、ドメインと移行先ディストリビューションの所有者であることを示す
  2. AWSがディストリビューション間のCNAMEの付け替えを行う

実質的に、「CloudFront::AssociateAlias API でアトミックに付け替え」のケースにおいて、CNAMEの付け替え者がユーザーからAWSに変わっただけです。

詳細は以下のドキュメントを参照ください。

最後に

Amazon CloudFrontの CNAMEAlreadyExists エラーの回避方法を3パターン紹介しました。

アトミックな付替えAPIの誕生、ワイルドカードCNAMEの制約の軽減などにより、ユーザー自身で回避できるケースが増えました。

AWSアカウントをまたいだディストリビューションを取得する CloudFront::ListConflictingAliases API一部情報がマスクされていたり、 CNAMEを付け替える CloudFront::AssociateAlias API はACTIVEな移行元ディストリビューションを付け替えられないことなどから、 AWSはクロスアカウント向けの操作には慎重な姿勢が伺えます。

クロスアカウントでも API一発でアトミックにCNAME置換できるようになるのを気長に待ちたいと思います。

それでは。

参考