如何解决aws cloudformation软件包将一些本地路径转换为S3 uri,但并非全部
摘要:
我使用本地路径引用lambda函数的代码以及template.yml
文件中描述我的cloudformation设置的状态机。使用aws cloudformation package
将它们转换为S3 uris可用于lambda函数,但不适用于我要添加到设置中的状态机。
详细信息:
我有一个SAM / Cloudformation模板template.yml
,该模板依赖于应用于我的本地存储库的路径来访问lambda函数和状态机设置文件。
template.yml:
AWstemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31' # specifies that this is a SAM template,will be transformed to CFN on build
Resources:
WriteDataToDb:
Type: AWS::Serverless::Function
Properties:
CodeUri: src <- here
Handler: writer.write_to_db
...
ProcessDataStateMachine:
Type: AWS::Serverless::StateMachine
Properties:
DeFinitionSubstitutions:
WriteDataToDbFunctionArn: !GetAtt WriteDataToDb.Arn
DeFinitionUri: statemachine/dataprocessor.json <- here
...
我使用aws cloudformation package
命令将我的template.yml文件转换为纯cloudformation文件packaged.yml,并将相关代码存储在S3存储桶deploymentpackages
(虚拟名称)中。 packaged.yml中对lambda函数的引用已正确转换为S3 uris。但是,状态机文件的uri不会转换为S3 uri,而是保留为相同的本地路径。
packaged.yml:
...
WriteDataToDb:
Type: AWS::Serverless::Function
Properties:
CodeUri: s3://deploymentpackages/33fc42027aae846c97ca8e13fec1bba7 <- translated
Handler: writer.write_to_db
...
ProcessDataStateMachine:
Type: AWS::Serverless::StateMachine
Properties:
DeFinitionSubstitutions:
WriteDataToDbFunctionArn:
Fn::GetAtt:
- WriteDataToDb
- Arn
DeFinitionUri: statemachine/dataprocessor.json <- not translated
然后,当我尝试从我的packaged.yml
文件创建变更集时,出现错误'DeFinitionUri' is not a valid S3 Uri of the form 's3://bucket/key'
,这当然是有道理的,因为事实并非如此。
我的回购以以下方式组织:
├── src
│ ├── __init__.py
│ ├── ...
│ └── writer.py
├── statemachine
│ └── dataprocessor.json
├── template.yml
并且我已经验证src和statemachine文件夹都可以进入deploymentpackages
存储桶。
为什么aws cloudformation package
命令适用于lambda uri,但不适用于状态机?
解决方法
遗憾的是,不支持DefinitionUri
的{{1}} 用于此类替换。相反,支持AWS::Serverless::StateMachine
,因此其正确更改了。
supported的属性和资源是:
CodeUri
,
当我问这个问题时,aws cloudformation package
和sam package
是等效的,给我的印象是,因为aws cloudformation package
可以将本地Lambda函数路径毫无问题地转换为S3 uri。 >
我正在使用Codebuild处理转换,这是我遇到状态机buildspec.yml
错误时的DefinitionUri
文件:
version: 0.2
phases:
install:
runtime-versions:
python: 3.7
commands:
- aws cloudformation package --template-file template.yml --s3-bucket deploymentpackages --output-template-file packaged.yml --region eu-central-1
artifacts:
files:
- packaged.yml
事实证明,我确实确实需要使用sam package
或sam deploy
,所以这是一个buildspec.yml
文件,可以成功地将DefinitionUri
从本地路径转换为一个S3 uri,以防其他人撞墙:
version: 0.2
phases:
install:
runtime-versions:
python: 3.7
commands:
- pip install --user aws-sam-cli
- USER_BASE_PATH=$(python -m site --user-base)
- export PATH=$PATH:$USER_BASE_PATH/bin
- sam build -t template.yml
- sam package --template-file .aws-sam/build/template.yaml --s3-bucket deploymentpackages --output-template-file packaged.yml --region eu-central-1
artifacts:
files:
- packaged.yml
受this answer的启发。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。