🪄

AWS API Gateway: カスタムドメイン削除時のエラー解決とTerraform管理方法

2024/12/09に公開

エラー内容

terraformでAWS API Gateway のカスタムドメインを削除しようとした際に以下のエラーが発生しました。

Error: deleting API Gateway v2 Stage ($default): operation error ApiGatewayV2: DeleteStage, https response error StatusCode: 400, RequestID: xxxx-yyyy-zzzz, api error BadRequestException: Deleting stage $default failed. Please remove all base path mappings related to the stage in your domains: example-dashboard.example.com

原因

このエラーは、API Gateway Stage(例: $default)が カスタムドメインと Base Path Mapping に関連付けられている場合に発生します。
Base Path Mapping が存在していると、削除する際に依存関係が原因でブロックされます。

関連付けがあるカスタムドメインを削除するには、まず Base Path Mapping を削除する必要があります。

解決策

1. Base Path Mapping を削除

AWS マネジメントコンソールまたは AWS CLI を使用して、カスタムドメインに設定されている Base Path Mapping を削除します。

AWS マネジメントコンソールでの手順

  1. API Gateway コンソールにアクセス。
  2. 左メニューから「カスタムドメイン名」を選択。
  3. 対象のドメイン(例: example-dashboard.example.com)をクリック。
  4. 「Base Path Mappings」セクションで、関連付けられている Mapping を削除。

AWS CLI を使用した削除

aws apigatewayv2 delete-api-mapping --domain-name "example-dashboard.example.com" --api-mapping-id <API_MAPPING_ID>
aws apigatewayv2 delete-api-mapping --domain-name "example-detection.example.com" --api-mapping-id <API_MAPPING_ID>
aws apigatewayv2 delete-api-mapping --domain-name "example-managedb.example.com" --api-mapping-id <API_MAPPING_ID>

<API_MAPPING_ID> は以下のコマンドで取得できます:

aws apigatewayv2 get-api-mappings --domain-name "example-dashboard.example.com"

2. カスタムドメインを削除

Base Path Mapping を削除した後、カスタムドメイン自体を削除します。

aws apigatewayv2 delete-domain-name --domain-name "example-dashboard.example.com"
aws apigatewayv2 delete-domain-name --domain-name "example-detection.example.com"
aws apigatewayv2 delete-domain-name --domain-name "example-managedb.example.com"

Terraform でカスタムドメインを管理する方法

Terraform を使用してカスタムドメインとその関連付けを管理することで、一貫性のあるインフラ管理が可能になります。以下は、Terraform を使った具体的な例です。

1. カスタムドメインの作成

resource "aws_apigatewayv2_domain_name" "custom_domain" {
  domain_name              = "example-dashboard.example.com"
  domain_name_configuration {
    certificate_arn = aws_acm_certificate.domain_cert.arn
    endpoint_type   = "REGIONAL"
    security_policy = "TLS_1_2"
  }
}

2. Base Path Mapping の作成

resource "aws_apigatewayv2_api_mapping" "custom_mapping" {
  api_id      = aws_apigatewayv2_api.example_api.id
  domain_name = aws_apigatewayv2_domain_name.custom_domain.id
  stage       = aws_apigatewayv2_stage.example_stage.name
}

3. ACM 証明書の管理

Terraform を使って ACM 証明書を作成し、DNS 検証を自動化します。

resource "aws_acm_certificate" "domain_cert" {
  domain_name       = "example-dashboard.example.com"
  validation_method = "DNS"
}

resource "aws_route53_record" "domain_validation" {
  zone_id = aws_route53_zone.main.id
  name    = aws_acm_certificate.domain_cert.domain_validation_options[0].resource_record_name
  type    = aws_acm_certificate.domain_cert.domain_validation_options[0].resource_record_type
  records = [aws_acm_certificate.domain_cert.domain_validation_options[0].resource_record_value]
  ttl     = 300
}

まとめ

  • エラー原因: カスタムドメインの削除時に Base Path Mapping が存在しているため。
  • 解決策: Base Path Mapping を削除してからカスタムドメインを削除する。
  • Terraform 利用: カスタムドメイン、Base Path Mapping、ACM 証明書をコードとして管理することで、一貫性のあるインフラ管理を実現。

Terraform を使用することで、手動操作を減らし、再現性のある管理が可能になります。ぜひお試しください!

GitHubで編集を提案

Discussion