Как указать AutoPublishAlias ​​во время выполнения 'sam package / deploy'? - PullRequest
2 голосов
/ 09 марта 2020

Я завершаю наше развертывание AWS SAM в Jenkins как часть нашего конвейера CI / CD. Я хочу добавить «живой» псевдоним к лямбдам, например, когда мы объединяем, но я хочу, чтобы «сборки веток» были без псевдонима. Это позволяет разработчикам тестировать код в AWS, не будучи «живым». Кроме sed, заменяющего часть template.yaml перед запуском "sam package / deploy", есть ли другой способ выполнить sh this?

- UPDATE-- Похоже, я могу использовать параметры для создать среду в моей лямбде, но я не знаю, как переключаться между ними. Это будет выглядеть так:

Parameters:
  MyEnv:
    Description: Environment of this stack of resources
    Type: String
    Default: testing
    AllowedValues: 
      - testing
      - prod

Тогда я могу сослаться на это w /:

    Environment:
      Variables:
        ENV: !Ref: MyEnv

Если кто-то знает, как переключать этот параметр во время выполнения, что решает мою проблему.

1 Ответ

1 голос
/ 10 марта 2020

Я получил это работает. Мой template.yaml:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sams-app
Globals:
  Function:
    Timeout: 3
Parameters:
  Stage:
    Type: String
    Description: Which stage the code is in
    Default: test
    AllowedValues:
      - test
      - prod
Resources:
  HelloWorldSQSFunction:
    Type: AWS::Serverless::Function 
    Properties:
      Role: arn:aws:iam::xxxxxxxxxxxx:role/service_lambda_default1
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.7
      AutoPublishAlias: !Ref Stage
      DeploymentPreference:
       Type: AllAtOnce
      Environment:
        Variables:
          STAGE: !Ref Stage
Outputs:
  HelloWorldSQSFunction:
    Description: "Hello World SQS Lambda Function ARN"
    Value: !GetAtt HelloWorldSQSFunction.Arn

Мой лямбда-код:

import json
import os

def lambda_handler(event, context):
    stage = os.environ['STAGE']
    print(f"My stage is: {stage}")

    return {
        "statusCode": 200,
    }

И чтобы запустить его локально (я использую Cloud9):

DEVELOPER:~/environment/sams-app $ sam local invoke --parameter-overrides Stage=prod
Invoking app.lambda_handler (python3.7)

Fetching lambci/lambda:python3.7 Docker container image......
Mounting /home/ec2-user/environment/sams-app/hello_world as /var/task:ro,delegated inside runtime container
START RequestId: 85da81b1-ef74-1b7d-6ad0-a356f4aa8b76 Version: $LATEST
My stage is: prod
END RequestId: 85da81b1-ef74-1b7d-6ad0-a356f4aa8b76
REPORT RequestId: 85da81b1-ef74-1b7d-6ad0-a356f4aa8b76  Init Duration: 127.56 ms        Duration: 3.69 ms       Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 22 MB

{"statusCode":200}

One Стоит отметить, что это приведет к сбою проверки «sam validate». Информацию об этом смотрите: https://github.com/awslabs/serverless-application-model/issues/778

Особая благодарность JLarky за комментарий к этой теме: aws -sam-local environment переменные

...