本記事はAWS Advent Calendar 2021のカレンダー2の13日目の記事です。
今年も残すところあと僅かとなりました。
年末といえば大掃除ですが、部屋の大掃除だけでなくAWSアカウントの大掃除もしてみてはいかがでしょうか。
不要なリソースを削除することで、コスト削減はもちろん、すっきりした気持ちで新年を迎えたいですね。
本記事では、私が大掃除中に遭遇したエラーと対処法をTipsを交えながら紹介します。
削除対象
複数のCloudFormationスタックを持ったあるサービスです。
残念ながらサービス終了となったため、削除することになりました。
削除方法
デプロイ時と逆順でCloudFormationスタックを削除しました。
CloudFormationで定義していると、削除も楽ですね。
遭遇したエラーと対処法
The bucket you tried to delete is not empty. You must delete all versions in the bucket.
空でないS3バケットを含むスタックを削除した時に発生するエラーです。
S3バケットを空にしてからスタックを削除しましょう。
Tips: サイズが大きいS3バケットは空にするのに時間がかかるので、ライフサイクルルールを設定して空にするのがおすすめです。バージョニングを設定している場合は、2つのライフサイクルルールの設定が必要となります。詳しくはこちらをご確認ください。
Resource handler returned message: "Lambda was unable to delete xxx because it is a replicated function. Please see our documentation for Deleting Lambda@Edge Functions and Replicas.
CloudFrontの削除直後にLambda@Edgeを削除した時に発生するエラーです。
CloudFrontに紐づけられていたLambda@Edgeのレプリカが削除されるのを待つ必要があります。
レプリカは通常、数時間以内に削除されます。詳しくはこちらをご確認ください。
CloudFrontを削除して少し時間をおいてから再度Lambda@Edgeの削除を試みましょう。
role (arn:aws:iam:xxx) is invalid or cannot be assumed
IAMロールを誤って削除してしまった時に発生するエラーです。削除する順番を誤った場合に発生します。
同じ名前と権限を持つのロールを作成してから再度削除しましょう。
The specified hosted zone contains non-required resource record sets and so cannot be deleted.
ホストゾーンにデフォルト以外のレコードが存在すると発生するエラーです。
デフォルトのNSレコードとSOAレコード以外を削除してからホストゾーンを削除しましょう。
CloudFormationスタック削除後の注意点
CloudFormationスタックを削除しただけでは消えないリソースがあるため、注意が必要です。
私の場合は下記をAWS Console上で削除する必要がありました。
CloudFormationスタックを削除後に、利用していたサービスを一通り確認するのがよさそうです。
- CloudWatchSyntheticsのLambda関数
- CloudWatchSyntheticsのCloudWatchLogGroup
- Lambdaレイヤー 1
- AWS Chatbotのワークスペース
最後に
AWSアカウントの大掃除をすることで、すっきりとした気持ちで新年を迎えられそうです。
ぜひ皆さんもやってみてはいかがでしょうか。
なお、お掃除の際は、使用中のリソースを削除しないようにスタックの削除保護などを活用ください。
最後までお読みいただきありがとうございました。
-
Lambdaレイヤーの削除は全レイヤーバージョンを削除する必要があるため、手動で実施するのは大変です。私は下記スクリプトを使いました。よろしければお使いください。
↩import boto3 import sys # 第1引数にLayer名、第2引数に最新のバージョン番号を指定して実行 args = sys.argv layer_name=args[1] latest_version=int(args[2]) client = boto3.client('lambda') for version_number in range(latest_version, 0, -1): response = client.delete_layer_version( LayerName=layer_name, VersionNumber=version_number )