微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

aws cloudformation软件包将一些本地路径转换为S3 uri,但并非全部

如何解决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 packagesam 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 packagesam 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 举报,一经查实,本站将立刻删除。