ACMから証明書が削除できない事象と謎のロードバランサー

こんにちは、CS事業本部の若槻です。

今回は、API GatewayのAPIのカスタムドメイン名に利用していた証明書をAWS Certificate Manager(ACM)のマネジメントコンソールから削除しようとした際に「証明書は使用中」となり削除できないという事象に遭遇したので、その際の顛末をご紹介します。

事象

以下のような操作を実施した際に発生しました。

  1. ACMのマネジメントコンソールでカスタムドメインの証明書を作成
  2. 作成した証明書をAPI GatewayのAPIのカスタムドメイン名(リージョンAPIエンドポイント)に紐付けて利用
  3. APIのカスタムドメイン名が不要となったため、カスタムドメイン名を削除
  4. ACMコンソールからカスタムドメインの証明書を削除しようとすると「証明書は使用中」と表示されて証明書が削除できない←事象発生

項番4の操作の具体的な内容としましては、ACMで証明書一覧から削除したい証明書にチェックを入れて選択し、[アクション] - [削除]をクリックすると、以下のような 証明書を使用中という表示が出て、ダイアログ中の「削除」ボタンがグレーアウトによりクリックできませんでした。
image.png

回避

以下の2通りの方法で事象を回避することができました。

数分待ってから再度コンソールを利用して削除する

API Gatewayからカスタムドメイン名を削除してから数分待って再度ACMコンソールから削除を試みると削除可能となっており、証明書を削除することができました。 image.png

AWS CLIを利用して削除する

API Gatewayからカスタムドメイン名を削除した直後であっても、aws-clidelete-certificateコマンドにより証明書を削除することができました。

# 証明書が作成されている
$ aws acm list-certificates
{
    "CertificateSummaryList": [
        {
            "CertificateArn": "arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:certificate/12345678-1234-1234-1234-12345678abcd",
            "DomainName": "api.contoso.com"
        }
    ]
}

# delete-certificateにより証明書を削除できた
$ aws acm delete-certificate --certificate-arn arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:certificate/12345678-1234-1234-1234-12345678abcd

謎のロードバランサー

事象の回避は行うことができましたが、ここで気になったのが証明書を削除できなかった際の削除ダイアログの[証明書を使用中]表示内に関連リソースとして表示されていた謎のロードバランサーが何者なのかということです。当然、表示されているロードバランサーのARNのアカウントID969236854626私のものではない見知らぬIDとなります。
image.png

まず、ACMから証明書を削除できない事象についてググってみると以下のようなAWSドキュメントが見つかりました。

エッジ最適化された API エンドポイントをデプロイすると、Amazon API Gateway による Amazon CloudFront ディストリビューションを作成します。リージョン API エンドポイントをデプロイすると、API Gateway によって Application Load Balancer (ALB) を作成します。CloudFront ディストリビューションまたは ALB は、お客様のアカウントではなく API Gateway が所有しています。API Gateway をデプロイするために提供された ACM 証明書は、CloudFront ディストリビューションまたは ALB に関連付けられています。

今回API Gatewayに作成したカスタムドメイン名のAPIエンドポイントのタイプはリージョンです。
よって、関連リソースとして示された謎のロードバランサーは、リージョンAPIエンドポイントのデプロイ時(≒カスタムドメイン名の作成時)にAPI Gatewayによって作成されたApplication Load Balancerであるようです。
カスタムドメイン名作成時に選択したACM証明書は、実際にはこのロードバランサーに関連付けられる動作となるようです。

また、アカウントID969236854626についても以下のようなAWSドキュメントが見つかりました。

アカウントで作成された API Gateway 呼び出しのログ作成のために CloudTrail が有効な場合に、API のカスタムドメイン名が作成または更新されたとき、API Gateway は関連する CloudFront ディストリビューションの更新のログを作成します。これらの CloudFront ディストリビューションは API Gateway が所有しているので、これらのレポートされた CloudFront ディストリビューションは、API 所有者のアカウント ID ではなく、以下のリージョン固有の API Gateway アカウント ID の 1 つにより識別されます。

リージョン アカウント ID (中略) ap-northeast-1 969236854626

カスタムドメインの作成時にロードバランサーのデプロイを行うのは、API所有者であるわたしのアカウントIDではなく、ap-northeast-1リージョン固有のAPI GatewayアカウントIDであるようです。

まとめ

  • API Gatewayでカスタムドメイン名を作成すると、API GatewayのアカウントID969236854626によってApplication Load Balancer(ロードバランサー)が作成される。
  • カスタムドメイン名作成時に指定したACM証明書は、実際にはこのロードバランサーに関連付けられる。
  • カスタムドメイン名を削除したあともこのロードバランサーは少しの間残り続けるため、関連リソースが残っているACM証明書はその間削除できない。
  • 理由は分からなかったが、AWS内部のリソースの状況の伝搬が早いからなのか、マネージメントコンソールよりもAWS CLIからの方がACM証明書を早く削除できた。

おまけ

事象再現検証を繰り返していると、たまに以下のようにACM証明書に謎のロードバランサーが3つも紐付いているときもありました。お得感があるようなないような。
image.png

参考

以上