AWS 无服务器、CloudFormation:错误,尝试将非字符串值填充到变量的字符串中

Dat*_*ray 2 amazon-web-services aws-cloudformation serverless-framework aws-serverless

我正在使用无服务器框架在 AWS 云上部署我的应用程序。

https://serverless.com/
Run Code Online (Sandbox Code Playgroud)

我想在 serverless.yml 文件中使用 AWS 账户 ID 的值,并且我想将账户 ID 作为环境变量导出,以便可以从 Lambda 函数访问它。

基于这个 lambda 函数的值,我想创建一些资源(比如 IAM 角色等),这些资源引用这个 accountId 变量。

但是当我尝试部署堆栈时,出现以下错误,

尝试将非字符串值填充到变量 ${self:custom.accountId} 的字符串中。请确保该属性的值是一个字符串。

我的 Serverless.yml 文件如下

custom:
  accountId : !Ref "AWS::AccountId"


provider:
  name: aws
  runtime: go1.x
  stage: dev

  region: us-east-1

  environment:
     ACCOUNT_ID : ${self:custom.accountId}       
     myRoleArn: arn:aws:iam::${self:custom.accountId}:role/xxxxxxxx
Run Code Online (Sandbox Code Playgroud)

有什么办法可以引用 serverless.yml 文件中的 Account Id 的值吗?

K M*_* Mo 5

您不能在 serverless.yml 中引用 AWS::AccountId,因为它在创建 CloudFormation 模板时并没有完全转换。

解决方法是使用无服务器插件Pseudo Parameters

您可以使用 npm 安装插件。

npm install serverless-pseudo-parameters
Run Code Online (Sandbox Code Playgroud)

您还需要将插件添加到 serverless.yml 文件中。

plugins:
  - serverless-pseudo-parameters
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 #{AWS::AccountId} 引用您的 AccountId

functions:
  helloWorld:
    handler: index.handler
    events:
      - http:
          path: /
          method: get
    environment:
      ACCOUNT_ID : #{AWS::AccountId}
Run Code Online (Sandbox Code Playgroud)

请注意,引用以散列而不是美元符号开头。