Мы развертываем лямбду с использованием шаблонов 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/*'