解析 AWS codedeploy 挂钩中的状态回调
Resolving status callback in AWS codedeploy hook
我在 运行ning codedeploy
时收到此错误
这是我的 appspec.yaml 文件
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "arn:aws:ecs:ap-southeast-1:xxx:task-definition/xxxx-def:latest"
LoadBalancerInfo:
ContainerName: "yyyyy"
ContainerPort: 80
# Optional properties
PlatformVersion: "LATEST"
NetworkConfiguration:
AwsvpcConfiguration:
Subnets: ["subnet-xxx","subnet-yyy"]
SecurityGroups: ["sg-zzz"]
Hooks:
- BeforeInstall: "drush-updb"
这就是 drush-updb
在 AWS lambda
中所做的
def lambda_handler(event,context):
client = boto3.client('ecs')
response = client.run_task(
overrides={
'containerOverrides': [
{
'name': 'AAA-BBB',
'command': [
"ccdd"
],
}
]
}
)
return {
'statusCode': 200,
'body': str(response)
}
最后下面是 运行 代码部署的 IAM。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ecs:DescribeServices",
"ecs:CreateTaskSet",
"ecs:UpdateServicePrimaryTaskSet",
"ecs:DeleteTaskSet",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:ModifyListener",
"elasticloadbalancing:DescribeRules",
"elasticloadbalancing:ModifyRule",
"lambda:InvokeFunction",
"cloudwatch:DescribeAlarms",
"sns:Publish",
"s3:*"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"iam:PassRole"
],
"Effect": "Allow",
"Resource": "*",
"Condition": {
"StringLike": {
"iam:PassedToService": [
"ecs-tasks.amazonaws.com"
]
}
}
}
]
}
我确实有一个基于此 的 return 回调的状态代码,但它似乎不起作用。那么codedeploy接受什么样的回调呢?
我设法解决了这个问题。我需要在 run_task 语句之后显式调用 codedeploy.putLifecycleEventHookExecutionStatus
。
所以 lambda 函数看起来像这样
def lambda_handler(event,context):
client = boto3.client('ecs')
response = client.run_task(
overrides={
'containerOverrides': [
{
'name': 'AAA-BBB',
'command': [
"ccdd"
],
}
]
}
)
if response:
status='Succeeded'
try:
codedeploy.put_lifecycle_event_hook_execution_status(
deploymentId=event["DeploymentId"],
lifecycleEventHookExecutionId=event["LifecycleEventHookExecutionId"],
status=status
)
return True
except ClientError as e:
print("Unexpected error: %s" % e)
return False
我在 运行ning codedeploy
时收到此错误这是我的 appspec.yaml 文件
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "arn:aws:ecs:ap-southeast-1:xxx:task-definition/xxxx-def:latest"
LoadBalancerInfo:
ContainerName: "yyyyy"
ContainerPort: 80
# Optional properties
PlatformVersion: "LATEST"
NetworkConfiguration:
AwsvpcConfiguration:
Subnets: ["subnet-xxx","subnet-yyy"]
SecurityGroups: ["sg-zzz"]
Hooks:
- BeforeInstall: "drush-updb"
这就是 drush-updb
在 AWS lambda
def lambda_handler(event,context):
client = boto3.client('ecs')
response = client.run_task(
overrides={
'containerOverrides': [
{
'name': 'AAA-BBB',
'command': [
"ccdd"
],
}
]
}
)
return {
'statusCode': 200,
'body': str(response)
}
最后下面是 运行 代码部署的 IAM。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ecs:DescribeServices",
"ecs:CreateTaskSet",
"ecs:UpdateServicePrimaryTaskSet",
"ecs:DeleteTaskSet",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:DescribeListeners",
"elasticloadbalancing:ModifyListener",
"elasticloadbalancing:DescribeRules",
"elasticloadbalancing:ModifyRule",
"lambda:InvokeFunction",
"cloudwatch:DescribeAlarms",
"sns:Publish",
"s3:*"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"iam:PassRole"
],
"Effect": "Allow",
"Resource": "*",
"Condition": {
"StringLike": {
"iam:PassedToService": [
"ecs-tasks.amazonaws.com"
]
}
}
}
]
}
我确实有一个基于此
我设法解决了这个问题。我需要在 run_task 语句之后显式调用 codedeploy.putLifecycleEventHookExecutionStatus
。
所以 lambda 函数看起来像这样
def lambda_handler(event,context):
client = boto3.client('ecs')
response = client.run_task(
overrides={
'containerOverrides': [
{
'name': 'AAA-BBB',
'command': [
"ccdd"
],
}
]
}
)
if response:
status='Succeeded'
try:
codedeploy.put_lifecycle_event_hook_execution_status(
deploymentId=event["DeploymentId"],
lifecycleEventHookExecutionId=event["LifecycleEventHookExecutionId"],
status=status
)
return True
except ClientError as e:
print("Unexpected error: %s" % e)
return False