概述
WizTran Inc. 是一家想要颠覆运输行业的初创公司。 他们希望实现快速、可重复的发布周期,为客户提供新功能。 他们选择了 CloudFormation 进行基础设施部署和 AWS 代码套件为 CI/CD 提供的服务。 在最近的一次活动中,团队的一位 DevOps 工程师看到 CodePipeline 支持自定义操作。 它开辟了一系列可能性,团队对实施其中一些可能性感到兴奋。
完成!
背景
AWS CodePipeline 包括许多操作,可帮助您为自动发布流程配置构建、测试和部署资源。 AWS CodePipeline 支持自定义操作,可以利用这些操作实现广泛的集成。 在当前的发布流程中,团队有兴趣创建触发 Lambda Function 的自定义操作。
你的任务
你的一名团队成员开始努力实施它,后来离开了组织。 一名新团队成员加入了您的团队并部署了基础架构。 但是,部署的基础架构无法正常工作。 事实证明,前任工程师没有将最新的代码提交到源代码存储库(所有更改都存储在本地)。 CodePipeline 执行在超时前持续运行 1 小时。 您的团队需要你帮助解决问题并进行修复。
入门
检查挑战的输出属性选项卡以获取出现问题的 CodePipeline 的名称。 CodePipeline 已经在运行(正在进行中)。
需要注意的事
-您可以按照以下步骤停止管道执行 -点击 CodePipeline 中的 “停止执行” 按钮。 -选择当前正在进行的执行 -选择 “停止并放弃” 选项。 -点击 “停止” 按钮。 -要在进行更改后触发管道,请点击 CodePipeline 中的 “发布更改” 按钮。
库存
-CodePipeline -Lambda 函数:作为自定义操作步骤添加到 CodePipeline 中-BrokenPipelineLambdaFunction -IAM 角色 -CodePipeline -Lambda 函数 -适用于 CodePipeline 的 S3 存储桶
任务验证
CodePipeline 将成功执行,任务将在几分钟内自动标记为已完成。 此外,您可以随时通过点击挑战详情部分中的 “检查我的进度” 按钮来查看自己的进度。
使用的服务
CodePipeline、S3 存储桶、Lambda 函数、API Gateway
线索
惩罚: 15 点
线索 1:正在开始
与 Lambda 函数关联的 IAM 角色需要权限才能将结果发布到 CodePipeline。 Lambda 函数被命名为 BrokenPipelineLambdaFunction。 IAM 角色名称可以从 Lambda 控制台的 “权限” 选项卡中获取。 此角色缺少必要的权限。
惩罚: 19 点
线索 2:还有一个提示
Lambda 函数代码需要更新,才能将成功或失败结果提供给 CodePipeline。
下面列出了需要添加到代码中的 API:
把成功结果
import boto3
cp_client = boto3.client('codepipeline')
cp_client.put_job_success_result(jobId=event['CodePipeline.job']['id'])
放失败结果
import boto3
cp_client.put_job_failure_result(
jobId=event['CodePipeline.job']['id'], failureDetails={'message': str(e), 'type': 'JobFailed'})
惩罚: 22 点
线索 3:完成演练
更新 IAM 权限
有两种方法可以更新 Lambda 函数 IAM 角色:
-添加内联策略 -选择 IAM 角色,然后单击 Add inline policy。 -选择 JSON 选项卡并将内容替换为以下内容:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"codepipeline:PutJobFailureResult",
"codepipeline:PutJobSuccessResult"
],
"Resource": "*"
}]
}
-点击页面底部的 “查看政策” 按钮。 -为策略添加名称,然后单击 “创建策略”。 -附加现有的托管 IAM 策略:AWSCodePipelineCustomActionAccess。下面列出了步骤: -选择 IAM 角色,然后单击 “附加策略” 按钮。 -在搜索栏中搜索 AWSCodePipelineCustomActionAccess。 -选择生成的 IAM 策略,然后单击右下角的 “附加策略” 按钮。
更新 Lambda 函数源代码
用以下代码替换 Lambda 代码。Lambda 函数名称是 BrokenPipelineLambdaFunction。
import ssl
import os
import json
import boto3
from urllib.request import urlopen
cp_client = boto3.client('codepipeline')
ssl._create_default_https_context = ssl._create_unverified_context
def lambda_handler(event, context):
url = os.getenv('API_URL')
try:
status_code = urlopen(url).getcode()
print(status_code)
cp_client.put_job_success_result(jobId=event['CodePipeline.job']['id'])
return {
'statusCode': status_code,
'body': "Completed Lambda execution successfully"
}
except Exception as e:
print(f'Error occurred - {str(e)}')
cp_client.put_job_failure_result(
jobId=event['CodePipeline.job']['id'],
failureDetails={'message': str(e), 'type': 'JobFailed'})
return {
'statusCode': 500,
'body': "Lambda execution completed. Internal error occurred"
}
触发管道
做出这两项更改后,重新触发管道。 如果它已经在运行,请先停止它。 挑战详情部分详细介绍了启动(和停止)CodePipeline 的步骤。