0

我刚开始使用无服务器框架。

我试图部署一个从 lambda 连接到 RDS 的端点,所以我在 serverless.yaml 文件中定义了一个处理程序、一个路由和一个资源:

provider:
  name: aws
  runtime: nodejs6.10
  environment:
    RDS_DB: mydb${opt:stage, self:provider.stage}
    RDS_USER: foo
    RDS_PASSWORD: bar

functions:
  foo:
    handler: foo.handler
    events:
      - http:
          path: api/v1/foos

resources:
  Resources:
    RdsCluster:
      Type: AWS::RDS::DBInstance
      Properties:
        AllocatedStorage: 5
        DBInstanceClass: db.t2.micro
        Engine: MySQL
        MasterUsername: ${self:provider.environment.RDS_USER}
        MasterUserPassword: ${self:provider.environment.RDS_PASSWORD}
        DBName: ${self:provider.environment.RDS_DB}

现在我想在 foo.handler 中编写连接到数据库的代码,为此我需要获取数据库主机:

var mysql      = require('mysql');

var connection = mysql.createConnection({
    host: '<db_host>',
    user: process.env.RDS_USER,
    password: process.env.RDS_PASSWORD,
    database: process.env.RDS_DB
});

有没有办法从 serverless.yaml 资源定义中动态获取这些信息,而不是在处理程序本身中硬编码?

4

1 回答 1

0

我发现这可以使用 Fn::GetAtt 将值作为环境变量传递:

custom:
  rdsHost:
    'Fn::GetAtt': [RdsCluster, Endpoint.Address]

functions:
  foo:
    handler: foo.handler
    events:
      - http:
          path: api/v1/foos
    environment:
      RDS_HOST: '${self:custom.rdsHost}'
于 2017-11-27T14:42:27.410 回答