【问题标题】:[serverless-framework]Deploying app to a new stage tries to update old stage[serverless-framework]将应用程序部署到新阶段尝试更新旧阶段
【发布时间】:2021-05-04 15:04:57
【问题描述】:

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

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

这里是 serverless.yaml 文件。

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

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

serverless deploy

这在 CloudFormtion 中创建了一个名为 lookups-dev 的堆栈,一个名为 lookup-dev 的 DymanoDB 表 DB 表和一个名为 lookups-dev-createOrUpdateLookupslookups-dev-getLookup 的 lambdas。

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

serverless deploy --stage prod

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

这是完整的错误:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2018-07-25
      相关资源
      最近更新 更多