AWS関連

【AWS】無効化したKMS も課金対象になるって知ってた?

私は知りませんでした。

最近、とある個人用AWSアカウントにおいて、

AWS Key Management Service(AWS KMS) で作成したカスタマーマスターキー(CMK) で地味な課金があることに気づきました。

よくよく調べてみると、「不要になったCMK を無効化していたが、削除し忘れていた」状態であることがわかりました。

そして、無効化されたCMK が課金対象であることを、このとき初めて知りました。。

アカウントでアクティブまたは無効になっているすべての CMK の料金を請求されます
(参考:カスタマーマスターキー(CMK) の料金が発生するのはなぜですか?|公式

不要CMK が他に無いか調査するスクリプト作りました

ということで今回は、

「削除したほうがよいと思われるCMK の候補一覧」を取得するためのスクリプトを作成したので、以下に共有いたします。

マネジメントコンソール画面から確認しようとすると、各リージョンで照会する必要があるのですが、

そんな時間がもったいないのでスクリプト作ってみました。

(画面でポチポチするより、スクリプト作る方が時間かかる点には触れないでください。笑)

かなり不格好なスクリプトではありますが、誰かの参考になれば幸いです。

スクリプトの内容は十分確認の上、自己責任でご利用ください。スクリプト実行によるいかなる問題についても責任は負いかねます

作成したスクリプトの使い方

(事前準備)

シェルスクリプト実行前に以下の変数を設定します。
スクリプト内では、ローカル環境のターミナルからAWS CLI を実行することとなるため、対象AWS アカウント用に設定しているプロファイル情報を変数にセットします。
※複数プロファイルの設定を行っていない場合は、”default”でOK。

# 作業対象アカウントのプロファイル名を指定
export MASTER_PROFILE='default' \
&& echo ${MASTER_PROFILE}

(不要CMK のチェック用シェルスクリプト)

#!/usr/bin/sh
# AWS KMS で作成されたカスタマーマスターキー(CMK) のうち、無効化されており
# 未使用と思われるキーが存在しないか確認するためのスクリプト

# 対象CMK が無効化されているか否かを確認
CheckDisabledCMK(){
    ENABLED_VALUE=$( \
        aws kms describe-key \
            --region $1 \
            --key-id $2 \
            --query "KeyMetadata.Enabled" \
            --profile ${MASTER_PROFILE} \
        )

    if [ "${#ENABLED_VALUE}" -ne "0" ] ; then
        if [ "${ENABLED_VALUE}" = "false" ] ; then
            echo "(このキーは無効化されています)"
        else
            echo "(有効化されたキー)"
        fi
    else
        echo "処理に【失敗しました】。"
    fi
}

# リージョン内に存在するキー のKeyIdを取得(AWS マネージド型キーを含む)
ListCMK(){
    KEY_IDS=$( \
        aws kms list-keys \
            --region $1 \
            --query Keys[].KeyId \
            --output text \
            --profile ${MASTER_PROFILE} \
        )

    for keys in ${KEY_IDS[@]}; do
        echo "## KeyId: ${keys}"
        CheckDisabledCMK $1 ${keys}
    done
}

echo "■環境変数の確認"
echo "MASTER_PROFILE= ${MASTER_PROFILE}"
echo ""

# リージョン一覧の取得
REGIONS=$( \
    aws ec2 describe-regions \
        --all-regions \
        --query "Regions[].RegionName" \
        --output text \
        --profile ${MASTER_PROFILE} \
    )

echo "■不要CMK Check start"

for region in ${REGIONS[@]}; do
    echo "------------------------"
    echo "# ${region}"
    if [ "${region}" = "af-south-1" ] || # ケープタウン
       [ "${region}" = "eu-south-1" ] || # ミラノ
       [ "${region}" = "me-south-1" ] || # バーレーン
       [ "${region}" = "ap-east-1" ] ; then # 香港
        echo "// Skip (KMS 未提供)"
    else
        # 当該リージョンで、検索を実施
        ListCMK ${region}
    fi
    echo ""
done

echo ""
echo "■不要CMK Check end"

ここで一番言っちゃいけないことを言わせていただきますが、

冒頭で触れた未使用キーへの課金、

かーなり少額なので、人によっては「無視して良いレベルの話かもしれません」。笑

最後まで読んでいいただきありがとうございます。