嗨,任何人都可以帮助我如何在特定阶段部署无服务器,我有 1 个具有 2 个阶段的应用程序
dev
和 prod
。当部署到 dev
时,它工作正常并成功部署,但在 prod
阶段总是出现以下错误:
Error:
UPDATE_FAILED: FilterOptionLambdaFunction (AWS::Lambda::Function)
Resource handler returned message: "Lambda function xxxxxxx-api-prod-xxxxxx could not be found" (RequestToken: ee621797-de45-aa3f-118b-8f512d4a5f62, HandlerErrorCode: NotFound)
我尝试注释所有函数并留下 1 个函数来测试部署,但收到另一个错误,如下所示:
Error:
UPDATE_FAILED: EnterpriseLogAccessIamRole (AWS::IAM::Role)
Unable to retrieve Arn attribute for AWS::Logs::LogGroup, with error message Resource of type 'AWS::Logs::LogGroup' with identifier '{"/properties/LogGroupName":"/aws/lambda/xxxxx-api-prod-api"}' was not found.
这是我的
serverless.yml
:
org: xxxxxx
app: comeby-api
service: comeby-scheduler-api
frameworkVersion: "3"
custom:
serverless-offline:
noPrependStageInUrl: true
myEnvironment:
MESSAGE:
prod: "This is production environment"
staging: "This is staging environment"
dev: "This is development environment"
useDotenv: true
provider:
name: aws
runtime: nodejs14.x
region: ap-southeast-1
stage: prod
functions:
api:
handler: handler.handler
events:
- httpApi: "*"
# Alikhsan
SyncAlikhsanSB2:
SyncAlikhsanAMT:
SyncAlikhsanASG:
SyncAlikhsanIOI:
SyncAlikhsanJSB:
SyncAlikhsanSPY:
# Sync Product
Shopify:
SyncSenheng:
SyncXilnix:
Puma:
# Anything
FilterOption:
AriadneMaps:
handler: scheduler/update/AriadneMaps.handler
description: "Update Ariadne Maps (to view report of total visitor of specific store) in Database"
memorySize: 512
timeout: 900
events:
- schedule:
rate: cron(00 22 * * ? *)
enabled: true
- http:
path: /cron/ariadne
method: get
SendEmailUpdateProduct:
ReportPurchasing:
UpdateProductPricePuma:
UpdateFootFallCam:
plugins:
# - serverless-dotenv-plugin
- serverless-offline
- serverless-offline-scheduler
我从这些
UPDATE_FAILED
中猜测,您正在使用相同的无服务器文件进行开发和生产部署。基于此假设,您可能必须为两个部署提供单独的服务名称。如果您已使用服务名称 dev
部署到 comeby-scheduler-api
环境,则具有相同服务名称的 prod 阶段的下一个部署将尝试覆盖之前的部署。
就我而言,我使用 2 个独立的无服务器配置文件(一个用于开发,另一个用于生产)解决了这个问题。对于
dev
部署,我的配置文件 serverless-dev.yml
如下所示。
service: service-dev
provider:
name: aws
role: arn:aws:iam::<aws-account-id>:role/<my-lambda-role-name>
region: <region>
runtime: python3.8
environment:
DB_HOST: <host>
DB_PASSWORD: <pass>
DB_PORT: <port>
DB_DATABASE: <db_name>
DB_USER: <db_user>
plugins:
- serverless-python-requirements
- serverless-secrets-plugin
- serverless-api-compression
package:
patterns:
- '!venv/**'
- '!__pycache__/**'
- '!node_modules/**'
- '!test/**'
functions:
Lambda1:
handler: lambda_file_name.handler_function_name
memorySize: 512
timeout: 900
events:
- s3:
bucket: <bucket_name_for_this_lambda_trigger>
event: s3:ObjectCreated:*
rules:
- prefix: <filter_trigger_file_prefix>
- suffix: <filter_trigger_file_suffix>
existing: <true if an existing s3 bucket, false otherwise>
对于
prod
,serverless-prod.yml
文件是,
service: service-prod
provider:
name: aws
role: arn:aws:iam::<aws-account-id>:role/<my-lambda-role-name>
region: <region>
runtime: python3.8
... rest is similar
我针对这些单独阶段的部署命令是。
sls deploy -s dev -c serverless-dev.yml
sls deploy -s prod -c serverless-prod.yml
这个错误也发生在我身上,因为我之前设置了另一个具有相同名称和环境的(不相关的)服务。
Serverless 尝试更新现有的 cloudformation 模板,但失败并显示上述消息,因为之前创建的资源和更新的资源没有任何关联。
我的解决方案是找到并删除旧的云形成模板(因为我实际上不再需要它),但另一种选择是更改环境名称