当前位置: 首页 > 知识库问答 >
问题:

如何在CloudFormation中使用代码构建的输出工件?

路雅懿
2023-03-14

所以我有一个相当简单的堆栈,我正在尝试设置它,由一个订阅SNS主题的Lambda函数组成。我想将代码管道分为三个阶段:源代码(GitHub)-

我设法拼凑了一个模板和buildspec文件,但我不知道应该如何引用CodeBuild在CloudFormation模板中生成的输出工件;现在我只有占位符内联代码。

基本上,我应该在Lambda函数的Code:属性中放入什么来获取CodeBuild文件(这是我在CodePipeline中的输出工件)?

样板yml:

AWSTemplateFormatVersion: 2010-09-09
Resources:
  SNSTopic:
    Type: 'AWS::SNS::Topic'
    Properties:
      Subscription:
        - Endpoint: !GetAtt
            - LambdaFunction
            - Arn
          Protocol: lambda
  LambdaFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Runtime: python3.6
      Handler: main.lamda_handler
      Timeout: '10'
      Role: !GetAtt
        - LambdaExecutionRole
        - Arn
      Code:
        ZipFile: >
          def lambda_handler(event, context):
            print(event)
            return 'Hello, world!'
  LambdaExecutionRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
  LambdaInvokePermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      FunctionName: !GetAtt
        - LambdaFunction
        - Arn
      Action: 'lambda:InvokeFunction'
      Principal: sns.amazonaws.com
      SourceArn: !Ref SNSTopic

buildspec.yml:

version: 0.2
phases:
  install:
    commands:
      - pip install -r requirements.txt -t libs
artifacts:
  type: zip
  files:
    - template.yml
    - main.py
    - lib/*

共有3个答案

桂志诚
2023-03-14

我知道这个问题很老了,但我想我会回答山姆的问题

project_root/
  template.yaml
  buildspec.yaml
  my_lambda/
    my_lambda.py
    requirements.txt

样板亚马尔:

Transform: AWS::Serverless-2016-10-31

Resources:
  MyLambda:
    Type: AWS::Serverless::Function
    Properties:
      Handler: my_lambda.lambda_handler
      CodeUri: my_lambda/
      Runtime: python3.8

buildspec.yaml:

version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.8
    commands:
      - pip install aws-sam-cli
  build:
    commands:
      - sam build
      - sam package --s3-bucket mybucket --s3-prefix sam | sam deploy -t /dev/stdin --stack-name FOOSTACK --capabilities CAPABILITY_IAM

注意事项:

  1. sam构建pip安装您的lambda要求。txt
戚哲
2023-03-14

您的代码构建应该将zip文件放到S3存储桶中。因此,在lambdfunction资源的代码部分,您可以指向它。

Code:
   S3Bucket: the_bucket_where_CodeBuild_dropped_your_zip
   S3Key: the_name_of_the_zip_file_dropped

你不需要“ZipFile:”

有品
2023-03-14

由于AWS的支持,最终找到了解决方案。首先,我将此JSON放在CodePipeline中CloudFormation部署步骤的参数覆盖中:

{
  "buildBucketName" : { "Fn::GetArtifactAtt" : ["MyAppBuild", "BucketName"]},
  "buildObjectKey" : { "Fn::GetArtifactAtt" : ["MyAppBuild", "ObjectKey"]}
}

然后更改了我的CF模板,如下所示:

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  buildBucketName:
    Type: String
  buildObjectKey:
    Type: String

  Resources:
    ...
    LambdaFunction:
        ...
        Code:
            S3Bucket: !Ref buildBucketName
            S3Key: !Ref buildObjectKey

这将输出工件桶名称和对象键作为参数传递给CF,这样它就可以在S3中动态获取输出工件位置,而不必硬编码任何东西,使得模板方式更加便携。

 类似资料:
  • 我有一个Jenkins(我是新手)系统,它有一些限制: 主/从排列 从服务器是Windows 7 安装插件可能会遇到很大阻力 生成将存档到Windows共享 我正在使用构建后步骤将二进制文件推送到存档服务器,但我还没有找到一种方法来安排构建日志也在那里结束。我发现控制台输出可以在http://jenkins/job/$jobtitle/$buildnumber/consoletext上获得,但我不

  • 我创建了一个AWS代码管道,它分四个阶段运行。1) 来自github的源代码,2)将后端部署到Elastic Beanstalk,3)使用Codebuild构建前端代码(使用下面的buildspec文件),以及4)将webpack的结果部署到S3。 到目前为止,除了第三阶段的结果外,一切都按预期进行。Codebuild似乎将工件设置为源文件,而不是webpack构建的结果。在bucket和文件夹中

  • 我对webpack非常陌生,我发现在生产构建中我们可以减少整体代码的大小。目前,webpack构建了大约8MB的文件,main.js构建了大约5MB的文件。如何在生产构建中减少代码的大小?我从internet上找到了一个示例webpack配置文件,并为我的应用程序进行了配置,然后运行,它开始构建,它在目录中生成了一些文件。 null webpack.config.js webpack.produc

  • 问题内容: 我正在寻找一种生成代码的解决方案。我已经用谷歌搜索,搜索了SO和一些博客,但没有找到一个好的解决方案。 我想在类上添加注释,并且在编译时,一些方法和属性会自动添加到类中。 我正在寻找的解决方案的要点: 生成的代码可定制(强制) 无需调用任何外部工具(强制性) 仅JDK,无第三方框架( 强制 选配) 注释名称可自定义(可选) 例如 : 编译后,我的课看起来像这样: 编辑: 最后,我将我的

  • 我正在使用代码管道部署云形成模板。问题是这个Cloud形成模板有一些嵌套堆栈。嵌套堆栈模板需要在S3存储桶中。所以在触发主(父)CF模板之前,我需要将CF嵌套堆栈上传到S3。 我没有找到使用代码管道实现这一点的方法。 有什么建议吗?

  • 我开始学习AWS的CI/CD功能。到目前为止,我一直在基于microsoft/windowsservercore映像在Windows Server 2016本地创建docker映像,并手动将其推送到ECR(amazon容器注册表)。 在这一点上,我没有试图在CodeBuild中编译应用程序。我只是想建造容器。在本地,二进制文件位于子目录中,并复制到容器中。 CodeBuild项目失败,出现错误:无