[serverless-framework]将应用程序部署到新阶段尝试更新旧阶段

时间:2021-01-31 04:27:31

标签: amazon-web-services serverless-framework staging

我们有一个简单的无服务器应用程序,其中包含一个 dynamo 数据库表、几个 lambda 表达式和一个 API 端点。我们目前在开发阶段部署了应用。

我们在部署到生产阶段时遇到了一些问题。

这是 serverless.yaml 文件。

toBlocking()

我们使用以下 cli 命令将其部署到开发阶段:

service: lookups # app and org for use with dashboard.# serverless.com app: lookups org: xxxxxx provider: name: aws runtime: python3.8 environment: DYNAMO_DB_LOOKUP_TABLE_NAME: lookup_${self:provider.stage} S3_BUCKET: com.yyyyy.lookups.${self:provider.stage} iamRoleStatements: - Effect: Allow Action: - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:GetItem Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/${self:provider.environment.DYNAMO_DB_LOOKUP_TABLE_NAME}" functions: createOrUpdateLookups: handler: createOrUpdateLookups.createOrUpdateLookups description: create or update lookup entry in dynamodb environment: lookupTable: ${self:provider.environment.DYNAMO_DB_LOOKUP_TABLE_NAME} events: - s3: bucket: ${self:provider.environment.S3_BUCKET} event: s3:ObjectCreated:* rules: - suffix: .json getLookup: handler: getLookup.getLookup description: get persigned url for a lookup by location and lookup type environment: lookupTable: ${self:provider.environment.DYNAMO_DB_LOOKUP_TABLE_NAME} lookupBucket: ${self:provider.environment.S3_BUCKET} events: - http: path: v1/lookup method: get request: parameters: querystrings: location: true lookupType: true resources: Resources: lookupTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain Properties: TableName: ${self:provider.environment.DYNAMO_DB_LOOKUP_TABLE_NAME} AttributeDefinitions: - AttributeName: location AttributeType: S - AttributeName: lookup AttributeType: S KeySchema: - AttributeName: location KeyType: "HASH" - AttributeName: lookup KeyType: "RANGE" ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1

这在 CloudFormation 中创建了一个名为 serverless deploy 的堆栈、一个名为 lookups-dev 的 DymanoDB 表 DB 表以及名为 lookup-devlookups-dev-createOrUpdateLookups 的 lambda。

现在,当尝试使用此 cli 命令部署到名为 prod 的新阶段时

lookups-dev-getLookup

我们收到一条错误消息,指出表 lookups-dev 已存在于堆栈中,其堆栈 ID 为 lookups-dev 堆栈。

这是完整的错误:

<块引用>

发生错误:lookupTable - lookup_dev 已存在于堆栈 arn:aws:cloudformation:us-east-1:aaaaabbbbbbbbccccccdddddd:stack/lookups-dev/wwwwwwwww-wwwwwwwww-wwwwwwaws.

问题: 当我们已经在开发阶段部署了应用程序时,我们如何部署到新阶段。

1 个答案:

答案 0 :(得分:0)

发生的事情是您需要确保表的名称在不同阶段发生变化。我看到您使用 ${self:provider.stage} 尝试执行此操作,但所做的只是使用 provider 部分下的 stage 值,并且由于您尚未设置值,因此它始终使用默认值 dev。我建议在提供者下添加以下行,以便您拥有这样的内容:

provider:
  stage: ${opt:stage, 'dev'}

这意味着,如果您在 CLI 上使用 --stage 传递 stage,它会将 provider.stage 设置为该值或 dev 的默认值。