LoginSignup
4
1

More than 1 year has passed since last update.

AWSアカウントも年末の大掃除をしよう

Last updated at Posted at 2021-12-13

本記事は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アカウントの大掃除をすることで、すっきりとした気持ちで新年を迎えられそうです。
ぜひ皆さんもやってみてはいかがでしょうか。
なお、お掃除の際は、使用中のリソースを削除しないようにスタックの削除保護などを活用ください。
最後までお読みいただきありがとうございました。


  1. 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
        )
    
4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1