Разрешить безсерверную лямбду вызывать облачные часы - PullRequest
0 голосов
/ 06 марта 2019

У меня есть одна лямбда-функция в моем 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. Создайте разрешение.

Для удаления мне нужно действовать в обратном порядке.Я не нашел, если это (не допускает подстановочные знаки) ошибка или намеренное поведение.

1 Ответ

0 голосов
/ 07 марта 2019

Да, вы можете использовать подстановочные знаки '*', чтобы сделать его общим.

...