当 serverless.yml 文件存在时,无服务器配置凭据不起作用

Tom*_*Tom 3 aws-lambda bitbucket-pipelines serverless

我们尝试在 BitBucket 管道上使用无服务器方式部署 lambda,但在运行命令时遇到了问题serverless config credentials。这个问题也发生在 docker 容器和我们本地的机器上。

这是我们正在运行的命令:

serverless config credentials --stage staging --provider aws --key $AWS_ACCESS_KEY --secret $AWS_ACCESS_SECRET
Run Code Online (Sandbox Code Playgroud)

它给了我们错误:

Error: Profile default does not exist
Run Code Online (Sandbox Code Playgroud)

该配置文件在我们的 serverless.yml 文件中定义。如果我们在运行命令之前重命名 serverless 文件,它就会起作用,然后我们可以将 serverless.yml 文件放回去并成功部署。

例如

            - mv serverless.yml serverless.old
            - serverless config credentials --stage beta --provider aws --key $AWS_ACCESS_KEY --secret $AWS_ACCESS_SECRET
            - mv serverless.old serverless.yml
Run Code Online (Sandbox Code Playgroud)

我们尝试--profile default在那里添加开关,但没有什么区别。

值得注意的是,直到我们开始在无服务器文件中使用 SSM 参数存储之前,这并不是一个问题,当我们添加它时,它就开始给我们带来错误Profile default does not exist

serverless.yml(部分)

service: our-service

provider:
  name: aws
  runtime: nodejs12.x
  region: eu-west-1
  profile: default
  stage: ${opt:stage, 'dev'}

  iamRoleStatements:
    - Effect: 'Allow'
      Action: 'ssm:GetParameter'
      Resource:
        - 'arn:aws:ssm:eu-west-1:0000000000:parameter/our-service-launchdarkly-key-dev'
        - 'arn:aws:ssm:eu-west-1:0000000000:parameter/our-service-launchdarkly-key-beta'
        - 'arn:aws:ssm:eu-west-1:0000000000:parameter/our-service-launchdarkly-key-staging'
        - 'arn:aws:ssm:eu-west-1:0000000000:parameter/our-service-launchdarkly-key-live'
    - Effect: 'Allow'
      Action: 'kms:Decrypt'
      Resource:
        - 'arn:aws:kms:eu-west-1:0000000000:key/alias/aws/ssm'

  environment:
    LAUNCH_DARKLY_SDK_KEY: ${self:custom.launchDarklySdkKey.${self:provider.stage}}

custom:
  stages:
    - dev
    - beta
    - staging
    - live

  launchDarklySdkKey:
    dev: ${ssm:/our-service-launchdarkly-key-dev~true}
    beta: ${ssm:/our-service-launchdarkly-key-beta~true}
    staging: ${ssm:/our-service-launchdarkly-key-staging~true}
    live: ${ssm:/our-service-launchdarkly-key-live~true}

plugins:
  - serverless-offline
  - serverless-stage-manager

...
Run Code Online (Sandbox Code Playgroud)

TLDR:无服务器配置凭据仅在 serverless.yml 不存在时才有效,否则它会抱怨配置文件默认值不存在,只有在无服务器文件中使用 SSM 参数存储时才会出现问题。

cro*_*ers 5

profile您中的属性指serverless.yaml的是 中保存的凭据~/.aws/credentials。如果[default]该文件中不存在某个条目,无服务器将会抱怨。我可以想到两种可能的解决方案:

  1. 尝试profile从您的环境中serverless.yaml完全删除并仅使用环境变量。

  2. 保留profile: default您的serverless.yaml但设置凭据,~/.aws/credentials如下所示:

[default]
aws_access_key_id=***************
aws_secret_access_key=***************
Run Code Online (Sandbox Code Playgroud)

如果你选择#2,你就不用再跑了serverless config credentials