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

使用代码管道使用NestedStack部署Cloudformation

岳佐
2023-03-14

我正在使用代码管道部署云形成模板。问题是这个Cloud形成模板有一些嵌套堆栈。嵌套堆栈模板需要在S3存储桶中。所以在触发主(父)CF模板之前,我需要将CF嵌套堆栈上传到S3。

我没有找到使用代码管道实现这一点的方法。

有什么建议吗?

共有2个答案

叶国兴
2023-03-14

我们通过添加CodeBuild操作解决了这个问题,该操作使用aws cloudformation包将文件上传到S3

这是一个样例buildspec。yml for codebuild,展示了如何实现这一点:

version: 0.2

phases:
  build:
    commands:
      - CLOUDFORMATION_SRC_DIR="$CODEBUILD_SRC_DIR/cloudformation"
      - CFN_TMP=`mktemp` && aws cloudformation package --template-file "$CLOUDFORMATION_SRC_DIR/template.yml" --s3-bucket "my-s3-bucket" --s3-prefix "cfn_package/$CODEBUILD_BUILD_ID" --output-template-file "$CFN_TMP" && mv "$CFN_TMP" "$CLOUDFORMATION_SRC_DIR/template.yml"

artifacts:
  secondary-artifacts:
    cloudformation:
      base-directory: $CLOUDFORMATION_SRC_DIR
      files:
        - '**/*'
马坚白
2023-03-14

一种方法是使用Git钩子将嵌套的堆栈复制到S3,例如接收后钩子。

另一个是在管道中添加另一个阶段来调用Lambda函数。您可以按照本文来配置此步骤。设置“输入工件”字段时,CodePipeline将工件zip文件的路径作为事件的一部分传递。然后Lambda函数提取zip文件并将堆栈上传到bucket。

下面是下载的Python代码示例

import boto3
import zipfile

def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    codepipeline = boto3.client('codepipeline')

    artifacts_location = event["CodePipeline.job"]["data"]["inputArtifacts"][0]["location"]["s3Location"]
    jobId = event["CodePipeline.job"]["id"]

    try:
        print("Downloading artifacts")
        s3.Bucket(artifacts_location["bucketName"]).download_file(artifact_location["objectKey"], '/tmp/artifacts.zip')
        zip_ref = zipfile.ZipFile('/tmp/artifacts.zip', 'r')
        zip_ref.extractall('/tmp')
        zip_ref.close()
    except ClientError as e:
        print("Cannot process the artifacts: {}".format(str(e)))
        codepipeline.put_job_failure_result(
           jobId=jobId,
           failureDetails={"type": 'JobFailed', "message": str(e)}
        )
        return

    # Perform the steps to copy your files from /tmp folder.
    codepipeline.put_job_success_result(jobId=jobId)

 类似资料:
  • 我正在尝试构建一个代码管道,以: 以github Java源代码项目为例 我能造罐子(我有第二阶段的工作)。我假设第3阶段将涉及调用sam模板来进行部署。该模板是同一github repo的一部分。 我的问题是:我看不出如何将jar和模板文件提供给第三阶段来进行部署。 我附上以下三个文件以供参考: 一个构建规范,可以工作,但是我找不到生成的工件 1.buildspec.yml 2.codepipe

  • 我们已经建立了管道脚本,工作得很好。最近,我们决定使用bitbucket管道自动部署到elastic beanstalk,并遵循使用命令进行部署的教程。显然,此命令在管道上失败。配置文件似乎是合法的,因为它在本地运行。它还可以在管道文件中指定的同一图像的容器中运行,也可以从本地使用docker exec在同一图像的容器中运行命令。下面是管道文件和我们使用命令得到的错误。我显然漏掉了什么。如有任何帮

  • 我正在尝试使用代码构建操作在AWS代码管道上部署AWS CDK应用程序。 构建和部署在本地完美工作(因为它会!)但是在CodeBuild上运行时,命令失败 这很可能是一些琐碎的事情,但我却在挠头,想弄明白是什么! 项目结构是自动生成的(使用) 对于阶段是 是(此阶段的输入目录是阶段的工件,即目录) 阶段抛出cdk ls步骤中的错误。由于上面的构建/部署步骤在本地工作(在干净的签出中),我怀疑这可能

  • 基本上,我需要配置CI/CD与比特桶源代码到ECS容器。我想使用CodePipline部署新的ECR映像到ECS。 目前,AWS CodePipline中没有将bitbucket指定为源的选项。然而,我已经设法用webhooks配置了CodeBuild,这样它就可以构建docker文件,并在每次推送发布分支时将其推送到ECR。 我想将ECR配置为CodePipline中的“源”阶段,并将其部署到现

  • 传递参数 链接管道 我们可以将多个管道连接在一起,以便在一个表达式中使用多个管道。

  • 我一直在努力研究如何利用BitBucket的Pipelines将我的(Laravel)应用程序自动部署到Vultr Server实例上。 我手动执行以下步骤,我正在尝试自主复制: 我我的更改并到比特桶回购 我使用终端登录我的服务器: 我 到正确的目录: 然后我从我的 BitBucket 存储库: 然后我运行一些命令:,等。 然后我注销: 我的理解是,你可以使用管道来实现自动化,这是真的吗? 到目前