Разрешение обратного вызова состояния в обработчике кода AWS - PullRequest
0 голосов
/ 05 июля 2019

Я получаю эту ошибку при запуске codedeploy

enter image description here

Это мой файл 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"
                    ]
                }
            }
        }
    ]
}

У меня есть код состояния для обратного обратного вызова, основанный наэто ссылка но, похоже, не работает.Так какой тип обратного вызова принимает codedeploy?

1 Ответ

0 голосов
/ 10 июля 2019

Мне удалось решить проблему. Мне нужно явно вызвать codedeploy.putLifecycleEventHookExecutionStatus после оператора run_task.

Так что лямбда-функция выглядит так

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
...