Назад | Перейти на главную страницу

Невозможно развернуть одну и ту же лямбду в нескольких регионах из корзины s3

Мы развертываем лямбду с использованием шаблонов SAM CloudFormation.

Мы хотели бы упаковать лямбду в корзину S3, а затем развернуть AWS :: Serverless :: Function в нескольких регионах.

Однако лямбда-код должен находиться в том же регионе, где он развертывается.

AWS задокументировали, как обойти эту проблему, по сути, создав еще одну лямбда-форму. CopyZips чтобы скопировать zip-файл в каждый регион, где вы хотите его развернуть, и новую корзину s3 LambdaZipsBucket в каждом регионе, чтобы вставить его. Тогда ваша лямбда-функция будет выглядеть так:

MyFunction:
    DependsOn: CopyZips
    Type: AWS::Lambda::Function
    Properties:
      Code:
        S3Bucket: !Ref 'LambdaZipsBucket'
        S3Key: !Sub '${QSS3KeyPrefix}functions/packages/MyFunction/lambda.zip'

Проблема в том, что это зависит от знания точного пути к zip-файлу. В нашем случае мы используем подстановку шаблона SAM, поэтому мы никогда не указываем сегмент S3 или ключ S3 - вместо этого наша функция выглядит так:

  MyFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      CodeUri: ./MyCompany.Service.Broker.Public

Сегмент S3 вообще не упоминается в шаблоне CloudFormation. А лямбда, которую вы можете увидеть, просматривая ведро, имеет такое имя:

ApiFunction-CodeUri-2342873t823t482346-97346583746583745.zip

Это потому, что существует множество похожих zip-архивов, созданных во время сборки. Бессерверная модель шаблона декодирует это, и если мы посмотрим в консоли CloudFormation на вкладку шаблона и выберем «просмотреть обработанный шаблон», мы увидим, что поля S3Bucket и S3Key заполнены правильно.

Сборка выполняется в Azure DevOps с использованием AmazonWebServices.aws-vsts-tools.LambdaNETCoreDeploy.LambdaNETCoreDeploy@1 задача, где мы указываем имя сегмента и регион, но опять же, не имя zip-файла.

Учитывая, что у меня нет доступа в шаблоне к точному пути к zip-файлу лямбда, как я должен автоматизировать копирование zip-файла в локальную корзину?

ОБНОВИТЬ:

Я попытался добавить следующую строку в свойствах непосредственно перед CodeUri:

      Code:
        S3Bucket: !Ref 'LambdaZipsBucket'

Однако при развертывании я получил следующую ошибку:

Resource with id [ApiFunction] is invalid. property Code not defined for resource of type AWS::Serverless::Function 

Вы можете попробовать использовать политику с AWS :: Serverless :: Function и предоставить соответствующие разрешения. Какой вид разрешен в формате.

Policies:
    - AWSLambdaExecute
    - Version: '2012-10-17' 
      Statement:
        - Effect: Allow
          Action:
            - s3:GetObject
            - s3:GetObjectACL
          Resource: 'arn:aws:s3:::LambdaZipsBucket/*'