[serverless-framework]将应用程序部署到新阶段会尝试更新旧阶段
[serverless-framework]Deploying app to a new stage tries to update old stage
我们有一个简单的无服务器应用程序,其中包含一个发电机数据库 table、几个 lambda 表达式和一个 API 端点。我们目前在开发阶段部署了该应用程序。
我们在部署到生产阶段时遇到了一些问题。
这是 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 table DB table 和名为 lookups-dev-createOrUpdateLookups
和 [=15= 的 lambdas ].
现在尝试使用此 cli 命令部署到名为 prod 的新阶段时
serverless deploy --stage prod
我们收到一条错误消息,指出 table lookups-dev 已存在于堆栈中,其堆栈 ID 为 lookups-dev 堆栈。
这是完整的错误:
An error occurred: lookupTable - lookup_dev already exists in stack arn:aws:cloudformation:us-east-1:aaaaabbbbbbbccccccdddddd:stack/lookups-dev/wwwwwww-wwwwwww-wwwwwwaws.
问题:
当我们已经在开发阶段部署了应用程序时,我们如何部署到新阶段。
发生的事情是,您需要确保 table 的名称在不同阶段发生变化。我看到您使用 ${self:provider.stage}
来尝试执行此操作,但所做的只是使用 provider 部分下的 stage 值,因为您没有设置,它始终使用默认值 dev
。我建议在 providers 下添加以下行,这样你就有了这样的东西:
provider:
stage: ${opt:stage, 'dev'}
这意味着如果您使用 --stage 通过 CLI 上的阶段,它将 provider.stage 设置为该值或默认值 dev。
我们有一个简单的无服务器应用程序,其中包含一个发电机数据库 table、几个 lambda 表达式和一个 API 端点。我们目前在开发阶段部署了该应用程序。
我们在部署到生产阶段时遇到了一些问题。
这是 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 table DB table 和名为 lookups-dev-createOrUpdateLookups
和 [=15= 的 lambdas ].
现在尝试使用此 cli 命令部署到名为 prod 的新阶段时
serverless deploy --stage prod
我们收到一条错误消息,指出 table lookups-dev 已存在于堆栈中,其堆栈 ID 为 lookups-dev 堆栈。
这是完整的错误:
An error occurred: lookupTable - lookup_dev already exists in stack arn:aws:cloudformation:us-east-1:aaaaabbbbbbbccccccdddddd:stack/lookups-dev/wwwwwww-wwwwwww-wwwwwwaws.
问题: 当我们已经在开发阶段部署了应用程序时,我们如何部署到新阶段。
发生的事情是,您需要确保 table 的名称在不同阶段发生变化。我看到您使用 ${self:provider.stage}
来尝试执行此操作,但所做的只是使用 provider 部分下的 stage 值,因为您没有设置,它始终使用默认值 dev
。我建议在 providers 下添加以下行,这样你就有了这样的东西:
provider:
stage: ${opt:stage, 'dev'}
这意味着如果您使用 --stage 通过 CLI 上的阶段,它将 provider.stage 设置为该值或默认值 dev。