概要
AWS LambdaをCloudformationで作成した際、
「StartQuery へのリクエスト中にエラーが発生しました」
というエラーに遭遇しました。
原因と解決法を紹介します。
エラー概要
以下でCF実行。
LambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
-
Effect: Allow
Principal:
Service:
- sns.amazonaws.com
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: "/"
RoleName: LambdaRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSNSFullAccess
すると下記エラーがLambdaに表示されていて、試しに「テスト」のところから実施してみましたが失敗していました。
StartQuery へのリクエスト中にエラーが発生しました Log group '/aws/lambda/xxxxxxx' does not exist for account ID 'xxxxxxx' (Service: AWSLogs; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: xxxxxxx; Proxy: null)
原因
エラーメッセージは、Lambda関数がCloudWatch Logsにログを書き込むための権限がない、と言っています。
「/aws/lambda/xxxxxxx
」という名前のロググループが存在しないというエラーなので、手動で作成する?と思いましたが、さすがにそこだけ手動でやってくれというのはおかしいと思い調べてみる。
すると、Lambda関数が実行されるIAMロールにCloudWatch Logsにログを書き込む権限が必要であり、それが無かったために生じたエラーとわかりました。
解決方法
ということで以下のようにポリシーを付与します。
LambdaRoleTclosing:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
-
Effect: Allow
Principal:
Service:
- sns.amazonaws.com
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: "/"
RoleName: LambdaRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSNSFullAccess
- arn:aws:iam::aws:policy/AWSLambdaExecute # 追加
これでもう一度Cloudformation実行!
先ほどと同じLambdaの画面を確認してみる。
すると、先ほどと同じ箇所に同じエラー(StartQueryリクエストのエラー)が出ています。
しかしこれは問題ありませんでした。
StartQueryとは、CloudWatch Logs Insightsのクエリを実行するためのAPI。
既存のロググループに対してクエリを実行しますが、ロググループが存在しない場合は初めてのLambda関数実行時に自動作成されるからです。
なので、Lambda関数をテストで実行してみます。
すると、CloudWatch Logsにロググループが作成されたことが確認できました。
(参考)AWSLambdaExecuteとは
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::*"
}
]
}
AWSが提供する管理ポリシーの一つ。
S3バケットからオブジェクトの取得、バケットへの配置、CloudWatch Logsにログを書き込むための権限を提供するポリシーです。
全てのS3バケットとCloudWatch Logsに対するアクセスを許可しているため、セキュリティ上のリスクを踏まえて付与を判断されてください。