我一直在尝试在 AWS 代码管道上实现一项功能,但目前还无法实现。
所以,我在 Bitbucket 上有我的微服务代码存储库。在 Bitbucket 上,我构建了一个管道,将 jar 上传到相应的 S3 存储桶。我的应用程序在 AWS 上运行。
现在,每次成功上传 jar 后,都会触发一个事件,该事件充当我的代码管道的源。 CodePipeline 有两个阶段源阶段和 lambda 调用阶段。
假设我有两个服务,我必须构建一个管道,其中这些阶段具有多个彼此独立的步骤。我无法让它们独立识别。当 B-service 事件被触发时,A-service-step 和 b-service-step 都会被执行。
我尝试使用两种方法来实现这一目标:
我想做的就是避免创建多个管道并省去管理它们的麻烦,因为有相当多的微服务。
在您的 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 函数