У меня есть одна лямбда-функция в моем serverless.yml
.Это выглядит примерно так:
functions:
clean:
handler: app.run
events:
- schedule: rate(2 hours)
Работает довольно хорошо, и лямбда из коробки вызывается каждые 2 часа.Когда я добавляю новый rule
в Консоль AWS и устанавливаю вновь созданную лямбду в качестве цели, это также работает.И AWS Console, и Serverless framework создают в фоновой политике, что служба events.amazonaws.com
может invoke
эту конкретную функцию.Политика выглядит примерно так:
{
"Sid":"AWSEvents_rule_name_test",
"Effect":"Allow",
"Principal":{
"Service":"events.amazonaws.com"
},
"Action":"lambda:InvokeFunction",
"Resource":"arn:aws:lambda:eu-central-1:<account_id>:function:<lambda_name>",
"Condition":{
"ArnLike":{
"AWS:SourceArn":"arn:aws:events:eu-central-1:<account_id>:rule/<rule_name>"
}
}
}
Я хотел бы определить rule
программно и без необходимости поддерживать эти разрешения.Я создаю правило, затем создаю цель аналогично тому, как описано в документации https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html. Без шага разрешения это не работает.Я хотел бы иметь общее разрешение на уровне serverless.yml
, которое позволяет вызывать лямбду по любым существующим или еще не существующим правилам (поэтому я забочусь только о правилах и целях).Я имею в виду что-то, что говорило бы: «Предоставьте наблюдателю облака разрешение вызывать любую лямбда-функцию с любым правилом, определенным в моей учетной записи».Это намного повысило бы удобство использования моей функции.
Можно ли определить ту же политику, которая обычно генерируется Консолью AWS (см. Код выше), но немного более общую и в файле serverless.yml
?
Обновление: я заканчиваю тем, что пробую пример ниже.Предполагалось создать «общее» правило:
functions:
clean:
handler: app.run
events:
- schedule: rate(2 hours)
resources:
Resources:
cleanLambdaPermission:
DependsOn:
# This is how serverless converts function name. Has to be update accordingly when lambda gets renamed.
- cleanLambdaFunction
Type: AWS::Lambda::Permission
Properties:
FunctionName:
"Fn::GetAtt": [ cleanLambdaFunction, Arn ]
Action: "lambda:InvokeFunction"
Principal: "events.amazonaws.com"
SourceArn: "arn:aws:events:eu-central-1:<account_id>:rule"
Хотя выяснилось, что оно не работает, и мою лямбду никогда не вызывали по программно созданным правилам до Я добавил явное SourceArn, который отображает ровно одно правило на одну конкретную функцию.Я делаю это также программно в три этапа: 1. Создать правило.2. Создать цель.3. Создайте разрешение.
Для удаления мне нужно действовать в обратном порядке.Я не нашел, если это (не допускает подстановочные знаки) ошибка или намеренное поведение.