Amazon web services 仅当lambda使用AWS代码管道发生任何更改时,才执行云形成

Amazon web services 仅当lambda使用AWS代码管道发生任何更改时,才执行云形成,amazon-web-services,aws-lambda,amazon-cloudformation,aws-codepipeline,Amazon Web Services,Aws Lambda,Amazon Cloudformation,Aws Codepipeline,我正在使用AWS代码管道来执行云形成。我的源代码在GitHub存储库中提交。当我的github存储库中发生提交时,AWS代码管道将开始执行并执行云形成。这些功能运行良好 在我的项目中,我有多个模块。因此,如果只在一个模块中修改用户,则会更新整个模块的lambda。是否有任何方法可以使用AWS代码管道来限制这一点 我的代码管道有3个阶段 来源 建造 部署 下面是我的代码管道的快照 我们也遇到了类似的问题,最终我们得出结论,这完全不可能。因此,除非您将模块划分为不同的回购协议,并为每个回购协议创建单

我正在使用AWS代码管道来执行云形成。我的源代码在GitHub存储库中提交。当我的github存储库中发生提交时,AWS代码管道将开始执行并执行云形成。这些功能运行良好

在我的项目中,我有多个模块。因此,如果只在一个模块中修改用户,则会更新整个模块的lambda。是否有任何方法可以使用AWS代码管道来限制这一点

我的代码管道有3个阶段

  • 来源
  • 建造
  • 部署
  • 下面是我的代码管道的快照


    我们也遇到了类似的问题,最终我们得出结论,这完全不可能。因此,除非您将模块划分为不同的回购协议,并为每个回购协议创建单独的管道,否则它将始终执行所有操作。
    好的方面是,每次执行管道时,在执行云形成时,并不是完全重新部署所有内容。在部署阶段,您可以添加createchangeset部分,该部分基本上将检测从以前的CloudFormation部署中更改的内容,它将仅重新部署这些部分,而不会涉及其他任何内容

    为什么不将其建模为每个模块的管道?

    这正是我们最近面临的问题,虽然我看到一些评论提到使用单个存储库是不可能实现的,但我找到了一个解决方法

    通常,代码管道是由侦听GitHub/代码提交存储库的CloudWatch事件触发的。我没有触发管道,而是让CloudWatch事件触发一个lambda函数。在lambda中,我们可以编写逻辑以仅对发生更改的模块执行管道。这非常有效,并提供了对管道执行的大量控制。通过这种方式,可以从单个存储库创建多个管道,从而解决问题中提到的问题

    Lambda逻辑可以类似于:

    import boto3
    
    # Map config files to pipelines
    project_pipeline_mapping = {
            "CodeQuality_ScoreCard" : "test-pipeline-code-quality",
            "ProductQuality_ScoreCard" : "test-product-quality-pipeline"
            }
    
    files_to_ignore = [ "readme.md" ]
    
    codecommit_client = boto3.client('codecommit')
    codepipeline_client = boto3.client('codepipeline')
    
    def lambda_handler(event, context):
        projects_changed = []
        # Extract commits
        print("\n EVENT::: " , event)
        old_commit_id = event["detail"]["oldCommitId"]
        new_commit_id = event["detail"]["commitId"]
        # Get commit differences
        codecommit_response = codecommit_client.get_differences(
            repositoryName="ScorecardAPI",
            beforeCommitSpecifier=str(old_commit_id),
            afterCommitSpecifier=str(new_commit_id)
        )
        print ("\n Code commit response: ",  codecommit_response)
        
        # Search commit differences for files that trigger executions
        for difference in codecommit_response["differences"]:
            file_name = difference["afterBlob"]["path"]
            
            project_name = file_name.split('/')[0]
            
            print("\nChanged project: ", project_name)
            
            # If project corresponds to pipeline, add it to the pipeline array
            if project_name in project_pipeline_mapping:
                projects_changed.insert(len(projects_changed),project_name)
                
        
        projects_changed = list(dict.fromkeys(projects_changed))
        print("pipeline(s) to be executed: ", projects_changed)
        
        for project in projects_changed:
            codepipeline_response = codepipeline_client.start_pipeline_execution(
                    name=project_pipeline_mapping[project]
                    )
    

    查看AWS博客,了解以下主题:

    您可以将每个模块推送到不同的分支上吗?这是不可能的。早些时候,我们使用云9形成云。目前正在尝试使用代码管道自动化该过程。所有模块都将提交到“开发”分支。如果找不到任何其他解决方法,这将是最后一个选项。创建管道时,您的源阶段将是什么,因为在为pipelineSource创建源阶段时,lambda没有选项。source将是代码提交存储库。Lambda将被注册为监视管道的cloudwatch规则的目标。