如何在Serverless.yml中根据Stage动态切换DynamoDB ARN
实现Serverless.yml中按环境动态切换DynamoDB表ARN
下面提供两种可行方案,帮你根据stage环境变量自动切换DynamoDB表ARN:
方案一:使用自定义变量映射
直接在serverless.yml中定义不同环境的ARN映射,通过变量插值动态引用:
service: lambda-service frameworkVersion: '3' custom: # 定义各环境对应的DynamoDB表ARN dynamoDbArn: staging: arn:aws:dynamodb:ap-south-1:11111111:table/table-1 production: arn:aws:dynamodb:ap-south-1:22222222:table/table-1 provider: name: aws # 优先读取命令行传入的stage参数,默认值为staging stage: ${opt:stage, 'staging'} environment: NODE_ENV: ${self:provider.stage} # 将当前环境的ARN注入Lambda环境变量(可选,供代码中使用) DYNAMODB_TABLE_ARN: ${self:custom.dynamoDbArn.${self:provider.stage}} region: ap-south-1 runtime: nodejs18.x iam: role: statements: - Effect: Allow Action: - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem # 动态引用对应环境的ARN Resource: ${self:custom.dynamoDbArn.${self:provider.stage}} functions: api: handler: index.handler events: - httpApi: '*' plugins: - serverless-offline
部署命令
- 部署到staging环境:
serverless deploy(默认)或serverless deploy --stage staging - 部署到production环境:
serverless deploy --stage production
方案二:使用外部环境配置文件
当环境配置项较多时,可将不同环境的配置分离到单独文件,便于维护:
- 创建环境配置文件
env.staging.yml:
dynamoDbArn: arn:aws:dynamodb:ap-south-1:11111111:table/table-1
env.production.yml:
dynamoDbArn: arn:aws:dynamodb:ap-south-1:22222222:table/table-1
- 修改
serverless.yml加载对应文件:
service: lambda-service frameworkVersion: '3' custom: # 加载当前stage对应的配置文件 stageConfig: ${file(env.${self:provider.stage}.yml)} provider: name: aws stage: ${opt:stage, 'staging'} environment: NODE_ENV: ${self:provider.stage} DYNAMODB_TABLE_ARN: ${self:custom.stageConfig.dynamoDbArn} region: ap-south-1 runtime: nodejs18.x iam: role: statements: - Effect: Allow Action: - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem Resource: ${self:custom.stageConfig.dynamoDbArn} functions: api: handler: index.handler events: - httpApi: '*' plugins: - serverless-offline
部署命令与方案一一致,只需通过--stage参数指定环境即可自动加载对应配置。
内容的提问来源于stack exchange,提问作者mayank3503
相关产品推荐
相关产品推荐

