Aws lambda Lambda can';在CloudFormation模板的处理程序属性中插入代码版本时找不到该文件
我创建和部署的人工制品中有一个版本号。其形式如下:Aws lambda Lambda can';在CloudFormation模板的处理程序属性中插入代码版本时找不到该文件,aws-lambda,amazon-cloudformation,Aws Lambda,Amazon Cloudformation,我创建和部署的人工制品中有一个版本号。其形式如下: universe-0.0.1-SNAPSHOT.zip 其中0.0.1-SNAPSHOT是版本 现在,CloudFormation模板通过Fn::Join函数映射了处理程序: UFunctionCelestial: Type: AWS::Lambda::Function Properties: Code: S3Bucket: !Ref ArtefactRepositoryBucket
universe-0.0.1-SNAPSHOT.zip
其中0.0.1-SNAPSHOT
是版本
现在,CloudFormation模板通过Fn::Join函数映射了处理程序:
UFunctionCelestial:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: !Ref ArtefactRepositoryBucket
S3Key: !Join [ '', [!Sub '${AWS::StackName}-', !Ref CodeVersion, '.zip' ] ]
Handler: !Join [ '', [!Sub '${AWS::StackName}-', !Ref CodeVersion, '/src/lambdas/celestial_persist_function.handler'] ]
Role: !GetAtt [ UIAMRoleFunctionServiceRoleCelestial, Arn ]
Runtime: python3.7
Environment:
Variables:
CELESTIAL_TABLE_NAME: !Ref UTableCelestial
PRIMARY_KEY: id
DependsOn:
- UIAMRoleFunctionServiceRolePolicyCelestial
- UIAMRoleFunctionServiceRoleCelestial
...SNIP...
Parameters:
ArtefactRepositoryBucket:
Type: String
Description: S3 bucket for asset "foundry-cdk/CelestialHandler/Code"
CodeVersion:
Type: String
Description: S3 key for asset version "foundry-cdk/CelestialHandler/Code"
我想除了处理程序
属性之外,这大部分都是无关的
现在是!Ref CodeVersion
出于某种原因,该行的code version似乎评估为0/0/1-SNAPSHOT
,即使我使用以下命令调用此模板:
aws2云编队部署\
--模板文件${CF_模板文件}\
--区域${ACCOUNT_region}\
--堆栈名称${PROJECT_name}\
--强制上载\
--能力\
--参数覆盖\
ArtefactRepositoryBucket=${S3\u AWS\u RELEASES\u BUCKET}\
CodeVersion=${APPLICATION_VERSION}
我回显了${APPLICATION\u VERSION}
,是的,它的计算结果是0.0.1-SNAPSHOT
然而,当我走到控制台,看着我的Lambda时,我得到了一个信息:
Lambda找不到文件universe-0/0/1-SNAPSHOT/src/lambdas/sessional\u persist\u function.py。确保处理程序支持以下格式:file-name.method
所以我的问题是,为什么CloudFormation要把我的点变成斜线,并给Lambda一个无用的引用?这不是CloudFormation在做什么。你看到的行为是正常的行为 通常,当您将处理程序定义为“folder1.folder2.file.handler”时,它将查找
folder1
,然后在其中查找folder2
,然后在其中查找文件file.py
。最后,file.py
应该有一个名为handler
的函数
我假设您的zip文件有一个名为src
的顶级文件夹。在这种情况下,您的处理程序应该定义为src.lambdas.sessional\u persist\u function.handler
,因为您已经提到了zip文件使用S3Key
的位置
希望这能有所帮助。您是否尝试过将“${application\u version}”双引号引起来?事实上,这就是我开始的内容。我注意到我有
${APPLICATION\u VERSION}
双引号和${S3\u AWS\u RELEASES\u BUCKET}没有双引号,当我看到这个错误时,我删除了双引号,作为我早期修复这个错误的尝试之一。引用(或不引用)最终没有任何区别。我现在可以确认这一点,我将setup.py中的版本控制更改为0-0-1-SNAPSHOT
,突然一切正常。谢谢你的回答。