LoginSignup
1
0

More than 3 years have passed since last update.

AWS Lambda を CloudWatch Events ごと一括で消す方法

Posted at

Lambedaを消すのが面倒。

最近弊社では今まで使っていた Lambda をすべて Serverless Framework を使ってデプロイできるように置き換えました。
旧 Lambda のイベントやらなんやらを serverless.yml に移行していくのも面倒だったんですが、何より面倒なのは古い方の Lambda を消すこと。

Lambda 関数を消しただけだと関連する Event は消えない

そうです。残ってしまうんです。
コンソール上で Lambda 関数を削除しただけだと、Lambda をトリガーしていた CloudWatch Events はまるまる残ってしまいます。

数十の Lambda関数 に数個から十数個の Event が紐付いているので、これを一つずつ手で消していくとなると 相当な手間 ですし、消し忘れが発生して現実的ではありません。

Rule を消さないと Event を消せない

CloudWatch Event は イベントが発生したタイミングで何をトリガーするかという情報、Rule をもっています。まずは Rule を消さないと CloudWatch Event は消せません。

Lambda を消したいのに、CloudWatch Events も消さなくてはならない。CloudWatch Events を消したいのに Rule を消さなくてはならない。うんざりしますね。

AWS CLI で削除する順番。

CLI から消すには以下の手順を踏む必要があります。

  1. 対象の Lambda関数 の ARN を取得
  2. ARN を使って 対象の関数の Events を取得
  3. Event Name から対象の Event rule 一覧を取得
  4. 取得した rule をすべて削除
  5. Event を削除
  6. 3〜5を繰り返して Event をすべて削除
  7. Lambda関数 を削除

AWS CLI で CloudWatch Events ごと Lambda を削除するシェル

上記の手順を shell で実行できるようにしました。
※ 対象は CloudWatch Events のみです。

delete_lambda.sh
#!/bin/sh

# profileを指定します。
# 特に指定なければ以下のスクリプトから 「--profile $PROFILE」をすべて削除してください。
PROFILE=sample

# 削除したいLambda関数名の配列
LAMBDA_FUNCTIONS=("SampleHandler" "SQSHandler" "S3Handler")

for function in ${LAMBDA_FUNCTIONS[@]}
do
    echo "====== START FUNCTION $function ======"
    # 対象のfunctionのarnを取得
    arn=`aws lambda get-function \
            --function-name $function \
            --query 'Configuration.FunctionArn' \
            --profile $PROFILE`

    # 文字列からダブルクォートを削除
    arn=`echo $arn | sed 's/"//g'`

    echo "arn = $arn"

    # functionのevent triggerを取得する
    rules=`aws events list-rule-names-by-target \
            --target-arn $arn \
            --query 'RuleNames[]' \
            --profile $PROFILE`

    rules=$(echo $rules | jq -r .[])

    for eventName in ${rules[@]}
    do
        echo "  === START $eventName ==="

        # ruleを取得する
        res=`aws events list-targets-by-rule \
            --rule $eventName \
            --query 'Targets[].Id'\
            --profile $PROFILE`

        echo $res

        targets=$(echo $res | jq -r .[])

        for target in ${targets[@]}
        do
            # ruleを削除する
            aws events remove-targets --rule $eventName --ids $target --profile $PROFILE
            # echo "delete target : $target" # test
        done

        # CloudWatch eventを削除する
        aws events delete-rule --name $eventName --profile $PROFILE
        echo "  ==== END $eventName ===="
    done

    # lambda functionを削除する
    aws lambda delete-function --function-name $function --profile $PROFILE
    echo "====== END FUNCTION $function ======"
done

echo "DONE"

S3 Event など他の Event を消すにはこれでは足りない。

必要あればほかの Event も消せるようにシェルを改造しようと思います。
弊社では一旦 CloudWatch Events で十分だったためこれにて終了です。

1
0
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
1
0