콘텐츠로 이동

serverless-domain-manager delete_domain 에서 credentials 에러가 날 때

serverless framework로 관리하던 API Gateway + AWS Lambda 스택을 삭제하려고 했는데, serverless-domain-manager 플러그인 때문에 커스텀 도메인을 먼저 지워야 했다.

이때 sls delete_domain을 실행하자 아래 에러가 났다.

Terminal window
Error:
Error: Unable to delete domain 'XXXXX.com':
Unable to list hosted zones in Route53.
Could not load credentials from any providers
...

실제로는 API Gateway의 Custom Domain은 삭제됐지만, Route53의 A, AAAA 레코드는 그대로 남았다.

이번 경우에는 serverless.yamlprovider.profile을 플러그인이 제대로 읽지 못해서 생긴 문제로 봤다.

즉 로컬에 default credential이 없거나, default credential 권한이 부족한 상태에서 플러그인이 serverless.yamlprovider.profile을 읽지 못하고 default credential을 보다가 에러가 난 상황이었다.

해결 방법은 AWS_PROFILE을 shell 환경변수로 직접 지정한 뒤 다시 실행하는 것이었다.

Terminal window
export AWS_PROFILE=프로파일명

그 다음 커스텀 도메인을 먼저 지우고, 이후 스택 리소스를 삭제했다.

Terminal window
sls delete_domain -c serverless.yaml
sls delete_domain -c serverless.yaml -s staging
sls delete_domain -c serverless.yaml -s production
sls remove -c serverless.yaml
sls remove -c serverless.yaml -s staging
sls remove -c serverless.yaml -s production

핵심은 커스텀 도메인을 만들 때의 반대 순서로 지우는 것이다.

  • sls delete_domain
    • Route53의 A, AAAA 레코드 삭제
      • 해당 도메인 이름으로 지정되어 있던 A 레코드와 AAAA 레코드를 호스팅 영역(Hosted Zone)에서 삭제
    • API Gateway의 CustomDomainName 삭제
      • AWS API Gateway 콘솔의 사용자 정의 도메인 이름(Custom Domain Name) 리소스 자체를 삭제한다. 이때 도메인에 종속되어 있던 베이스 패스 매핑(Base Path Mapping) 설정도 구조상 함께 지워진다.
  • sls remove
    • API Gateway, Lambda, CloudWatch Logs 삭제
    • serverless.yaml에서 생성한 S3 버킷, IAM Role도 삭제

1) 커스텀 도메인이 실제로 삭제됐는지 확인하는 방법

섹션 제목: “1) 커스텀 도메인이 실제로 삭제됐는지 확인하는 방법”
  • API Gateway의 Custom Domain Name 목록에 삭제한 도메인이 남아 있는지 확인한다.
  • AWS CLI로도 확인할 수 있다.
Terminal window
# REST API를 사용하는 경우
aws apigateway get-domain-names
# HTTP API 또는 WebSocket API를 사용하는 경우
aws apigatewayv2 get-domain-names
Terminal window
# REST API 도메인인 경우
aws apigateway get-domain-name --domain-name yourdomain.com
# HTTP API 또는 WebSocket API 도메인인 경우
aws apigatewayv2 get-domain-name --domain-name yourdomain.com
  • https://example.com (❌ 잘못된 입력)
  • ://example.com (❌ 잘못된 입력)
  • example.com (⭕ 올바른 입력)
Terminal window
sls create_domain -c serverless.yaml
sls create_domain -c serverless.yaml -s staging
sls create_domain -c serverless.yaml -s production
sls deploy -c serverless.yaml
sls deploy -c serverless.yaml -s staging
sls deploy -c serverless.yaml -s production

즉 생성할 때는 create_domain -> deploy, 삭제할 때는 delete_domain -> remove 순서로 보면 된다.