大量にあるLambda Functionsのトリガーとの紐付き一覧を出力する

Lambdaって便利でついつい量産しちゃいますよね。
負債は負債として、量産してしまったLambda関数を整理する際に、どのトリガーから起動する設定になっているかを出したくなった際のエントリーになります。

トリガーを見れば、どのLambda関数がもう不要なのかの当てが付くかなと思い。

## 環境
```bash
$ 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`を利用します。

```bash
$ 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
```


```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
```

```bash
$ 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トークンの例です。
![Image 2021-10-18 at 4.25.38 PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31464/4fb9a5db-2634-df9f-f3ef-4b74749627df.jpeg)
※↑[Authy](https://authy.com)というアプリのスクショ。

プロンプト例
![ss 2021-10-18 16.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31464/0c75aa67-91bc-0728-4e29-dc2239a55fff.png)


キーチェーンに古い認証情報が残ってしまった際にリセットする便利コマンド

```bash
$ aws-vault remove hoge-dev
$ rm -fr ~/Library/Keychains/aws-vault.keychain-db
```

## 結論

```bash
$ 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`かと思ったのですが取得できず　[参照](https://stackoverflow.com/questions/56717199/can-i-get-the-lambda-function-trigger-information-using-aws-cli)
- `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便利だなー