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