Я успешно создал лямбда-функцию и корзину S3, используя стек облачной информации. Затем я запустил обновление стека, чтобы добавить триггер в корзину S3 для вызова лямбда-функции.
Когда я запускаю обновление, появляется следующая ошибка:
Unable to validate the following destination configurations (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; Request ID: XXXXX; S3 Extended Request ID: XXXXX
Это обновленный JSON, который я использую для добавления триггера в корзину S3:
"MyBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "my-bucket",
"NotificationConfiguration": {
"LambdaConfigurations": [
{
"Event": "s3:ObjectCreated:*",
"Function": "arn:aws:lambda:ap-southeast-2:my-lambda-arn"
}
]
}
Затем я добавил роль IAM, чтобы предоставить доступ к корзине S3 для вызова лямбда-функции:
"ResourceAccess": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Action": [
"sts:AssumeRole"
]
}
]
},
"Path": "/",
"Policies": [
{
"PolicyName": "giveaccesstodeltas3",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-southeast-2:my-lambda-arn",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "123456"
},
"ArnLike": {
"AWS:SourceArn": "arn:aws:s3:::my-bucket"
}
}
}
]
}
}
]
}
Выдает ошибку:
Policy document should not specify a principal. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument; Request ID: XXXXXX)
Я скопировал и вставил arn прямо из функции





Чтобы добавить этот триггер, вы должны дать вашей корзине S3 разрешение на вызов лямбда-функции. Кроме того, ваша лямбда должна иметь разрешение на вызов любых служб, на которые она влияет. Я предполагаю, что вам не хватает первых разрешений, которые нужно дать: разрешения для вашего ведра S3 для вызова вашей лямбда-функции.
Вы можете создать политику, подобную следующей, чтобы предоставить соответствующие разрешения вашему сегменту S3:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "<optional>",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "<ArnToYourFunction>",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "<YourAccountId>"
},
"ArnLike": {
"AWS:SourceArn": "arn:aws:s3:::<YourBucketName>"
}
}
}
]
}
См. эта документация AWS для получения дополнительной информации.
Спасибо за ответ. Я добавил политику, но при развертывании выдает ошибку, показанную в обновленном вопросе.
Вы пытались просто удалить определение принципала из политики?
Да, без основных ошибок с: Отсутствует обязательное поле Принципал
функция не существует или arn недействителен?