在 AWS-CodePipeline 管道中使用多个源进行 lambda 调用

问题描述 投票:0回答:1

我一直在尝试在 AWS 代码管道上实现一项功能,但目前还无法实现。

所以,我在 Bitbucket 上有我的微服务代码存储库。在 Bitbucket 上,我构建了一个管道,将 jar 上传到相应的 S3 存储桶。我的应用程序在 AWS 上运行。

现在,每次成功上传 jar 后,都会触发一个事件,该事件充当我的代码管道的源。 CodePipeline 有两个阶段源阶段和 lambda 调用阶段。

stages of code-pipeline

假设我有两个服务,我必须构建一个管道,其中这些阶段具有多个彼此独立的步骤。我无法让它们独立识别。当 B-service 事件被触发时,A-service-step 和 b-service-step 都会被执行。

我尝试使用两种方法来实现这一目标:

  1. lambda 调用阶段中的用户参数,但它没有用,因为最终这两个步骤都会在任何事件上触发。

enter image description here

enter image description here

  1. 在“更改检测选项”的源阶段 - 如果我使用 AWS CodePipeline 代替 Amazon cloudwatch 事件,则有一个变量,我可以看到“PollForSourceChanges”,如果触发器来自 A,则该变量的触发器值为 A-service-jar - 服务桶。但是,我无法在 lambda 调用阶段使用它。如果有办法在 lambda 脚本中提取该值,那么我可以编写条件脚本。

enter image description here

我想做的就是避免创建多个管道并省去管理它们的麻烦,因为有相当多的微服务。

amazon-web-services amazon-s3 aws-lambda aws-codepipeline
1个回答
0
投票

在您的 Lambda 函数中,访问传递到管道的事件数据。此事件数据将包含有关哪个 S3 存储桶触发了管道的信息。例如,在 Lambda 函数中,您可以提取存储桶名称并有条件地执行逻辑,这里我假设每个服务都有自己的 S3 存储桶:

import json

def lambda_handler(event, context):

    input_artifact = event['CodePipeline.job']['data']['inputArtifacts'][0]
    bucket_name = input_artifact['location']['s3Location']['bucketName']
    
    
    if "A-service-bucket" in bucket_name:
        print("Triggering A-service deployment...")
        # Add your specific A-service deployment logic here
    
    elif "B-service-bucket" in bucket_name:
        # Logic for B-service
        print("Triggering B-service deployment...")

    
    else:
        print("Unrecognized bucket:", bucket_name)
        raise Exception("Unknown bucket name")
    
    # Notify CodePipeline of a successful invocation
    return {
        'statusCode': 200,
        'body': json.dumps('Lambda function executed successfully')
    }

如果您希望将逻辑保留在 CodePipeline 本身内,则可以使用 CodePipeline 变量。您使用的 PollForSourceChanges 选项是一个好的开始,但您需要将该变量作为环境变量传递给 Lambda 函数

© www.soinside.com 2019 - 2024. All rights reserved.