Lambdaって便利でついつい量産しちゃいますよね。
負債は負債として、量産してしまったLambda関数を整理する際に、どのトリガーから起動する設定になっているかを出したくなった際のエントリーになります。
トリガーを見れば、どのLambda関数がもう不要なのかの当てが付くかなと思い。
環境
$ sw_vers
ProductName: macOS
ProductVersion: 11.5.2
BuildVersion: 20G95
$ uname -mrsv
Darwin 20.6.0 Darwin Kernel Version 20.6.0: Wed Jun 23 00:26:27 PDT 2021; root:xnu-7195.141.2~5/RELEASE_ARM64_T8101 arm64
aws-vaultのセットアップ
本エントリーでは認証情報を直接ローカルに保存するaws configure
ではなく、aws-vault
を利用します。
$ brew install aws-vault
$ aws-vault add default
Enter Access Key ID: XXXXXXXXXXXXXXXXXXXX
Enter Secret Access Key:
(ここでプロンプトが立ち上がり、aws-vaultの新しいパスワードの設定を行います。)
Added credentials to profile "default" in vault
$ vi ~/.aws/config
[profile default]
region=us-west-2
mfa_serial=arn:aws:iam::000000000000:mfa/shionel31
[profile hoge-dev]
source_profile=default
region=us-west-2
role_arn=arn:aws:iam::111111111111:role/OrganizationAccountAccessRole
mfa_serial=arn:aws:iam::000000000000:mfa/shionel31
$ aws-vault exec hoge-dev -- aws sts get-caller-identity
Enter token for arn:aws:iam::000000000000:mfa/shionel31: 432975
{
"UserId": "AAAAAAAAAAAAAAAAAAAA:2222222222222222222",
"Account": "111111111111",
"Arn": "arn:aws:sts::111111111111:assumed-role/OrganizationAccountAccessRole/2222222222222222222"
}
432975
の部分はMFAトークンの例です。
※↑Authyというアプリのスクショ。
キーチェーンに古い認証情報が残ってしまった際にリセットする便利コマンド
$ aws-vault remove hoge-dev
$ rm -fr ~/Library/Keychains/aws-vault.keychain-db
結論
$ aws-vault exec hoge-dev -- \
aws lambda list-functions \
| jq -r '.Functions[] | .FunctionName' \
| xargs -I% -n1 aws-vault exec hoge-dev -- \
aws lambda get-policy --function-name % --query Policy --output text 2> /dev/null \
| jq -r '.Statement[] | [.Resource[47:], .Condition.ArnLike["AWS:SourceArn"]] | @csv'
Enter token for arn:aws:iam::000000000000:mfa/shionel31: xxxxxx
"HogeTelemetry","arn:aws:iot:us-west-2:111111111111:rule/HogeTopic"
"HogeConversion","arn:aws:s3:::hoge-image-bucket"
"HogeAPI","arn:aws:execute-api:us-west-2:111111111111:qjor8q08ne/*/POST/hoge"
"HogeTarget","arn:aws:elasticloadbalancing:us-west-2:111111111111:targetgroup/alb-hoge-tg/63dbffcb04e4b2e1"
"HogeStream","arn:aws:kinesis:us-west-2:111111111111:stream/update-hoge-stream"
...
Lambdaの起動トリガーをFunction名と対で出力できました。
-
| xargs -I% -n1 ... --function-name %
の部分はパイプ前のコマンドの出力(リスト形式)を一個ずつ次のコマンドに渡す処理 -
aws lambda get-policy
はトリガーを取得するためのコマンド。一見get-function-configuration
かと思ったのですが取得できず 参照 -
2> /dev/null
は、トリガー(実態としてはポリシー)が設定されていないLambda関数に対して当コマンドを実行すると
An error occurred (ResourceNotFoundException) when calling the GetPolicy operation: The resource you requested does not exist.`
- というエラーが発生してしまうため、標準出力結果を綺麗なCSVにするために標準エラーに投棄
- jq内の
.Resource[47:]
は、純粋にFunction名だけ欲しかったのでARNのprefix(arn:aws:lambda:us-west-2:111111111111:function:
)を無理やり除去
おわりに
お使いの環境によってはすんなりいかない場合もあるかとは思います。
しかしjq便利だなー