事象
CloudWatchのActionにて以下のような設定が"Actions enabled"になっているが
Type | Description | Config |
Lambda | When ALARM, invoke "xx" Lambda Function | - |
アラーム発動時にHistoryには以下のような失敗のログが表示される。
Date | Type | Description |
xx | Action | Failed to execute action arn:aws:lambda:xx:function:xx. Received error: "CloudWatch Alarms is not authorized to perform: lambda:InvokeFunction on the resource because no resource-based policy allows the lambda:InvokeFunction action" |
執筆時期情報
- aws/amazon-cloudwatch-agent:v1.300032.3
原因/解決策
アラームアクションとしてLambdaを実行する場合、Lambdaのリソースポリシーを作成することでCloudWatch サービスプリンシパルによる関数の呼び出しを許可する必要がある。
具体的には実行するLambda側の"Configuration > Permissions"にて"Resource-based policy"から"Add permissions"を押下。
- action : lambda:InvokeFunction
- principal : lambda.alarms.cloudwatch.amazonaws.com
を選択して権限を作成する。
作成後は以下のようにリソースベースポリシー情報が表示され、CloudWatch Alarmsから実行が可能(Successfully executed action)となる。
Principal | PrincipalOrgID | Conditions | Action |
lambda.alarms.cloudwatch.amazonaws.com | - | None | lambda:InvokeFunction |
以下、補足です。
補足
リソースベースポリシーによって「誰がリソースにアクセスできるのか」「どのようなアクションを実行できるか」が指定できます。
公式ドキュメントを見ると以下のようなAWS CLIの実行が例として記載があるのでprincipalの値を参考にしました。
$ aws lambda add-permission \ --function-name my-function-name \ --statement-id AlarmAction \ --action 'lambda:InvokeFunction' \ --principal lambda.alarms.cloudwatch.amazonaws.com \ --source-account xx \ --source-arn arn:aws:cloudwatch:us-east-1:xx:alarm:alarm-name
ちなみにGUI上でもSource ARNは指定することができ、今回でいうところの特定のアラームに呼び出し元を制限することも可能です。
以上、ご参考ください。