如何编写 AWS Lambda 代码以向管道报告已完成的工作?

How code AWS Lambda to report back to pipline about job done?

编辑:更改了 lambda 函数和日志输出,问题 reminas :/

将以下 lambda 函数作为代码管道中的步骤:

import boto3
import json
import sys
import os
import pymysql
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

DB_HOST = os.environ['DB_HOST']
DB_USER = os.environ['DB_USER']
DB_PASS = os.environ['DB_PASS'], 
DB_PORT = int(os.environ['DB_PORT'])

codepipeline = boto3.client('codepipeline')
cursorType = pymysql.cursors.DictCursor

try:
    connection = pymysql.connect(
        host=DB_HOST, 
        user=DB_USER,
        password=DB_PASS, 
        port=DB_PORT,
     
    )
except pymysql.MySQLError as err:
    logger.error("Error: Could not connect to MySql db")
    logger.error(err)
    sys.exit()
    
logger.info("Success: Connected to MySql db")


def lambda_handler(event, context):
    cursor = connection.cursor()
    try:
        logger.info("Dropping db...")
        cursor.execute(f"drop database {DB_NAME}")
        logger.info("Creating db...")
        cursor.execute(f"create database {DB_NAME}")
        logger.info("Db created")
        connection.close()
        logger.info('Conection closed')
        job_id = event['CodePipeline.job']['id']
        logger.info("Job id `{job_id}`")
        response = codepipeline.put_job_success_result(jobId=job_id)
        logger.info(response)
    except Exception as err:
        logger.error(err)  
        response = codepipeline.put_job_failure_result(
            jobId=job_id, failureDetails={'message': message, 'type': 'JobFailed'}
        )
    return {
        "statusCode": 200,
    }

来自函数 运行 的函数日志:

START RequestId: 02e2f7cb-817d-4e49-90db-5b4cae5c9336 Version: $LATEST 
[INFO] 2020-09-23T07:38:34.515Z  Found credentials in environment variables. 
[INFO] 2020-09-23T07:38:34.598Z  Success: Connected to MySql db 
{'CodePipeline.job': {'id': '9a8b13ea-d4f8-4aea-8481-60db0b7b5b5d... snip} 
Dropping db 
Creating db 
Db created 
Conection closed 
[INFO] 2020-09-23T07:38:34.732Z 02e2f7cb-817d-4e49-90db-5b4cae5c9336 Job id 9a8b13ea-d4f8-4aea-8481-60db0b7b5b5d 
successfuly done 
END RequestId: 02e2f7cb-817d-4e49-90db-5b4cae5c9336 
REPORT RequestId: 02e2f7cb-817d-4e49-90db-5b4cae5c9336 Duration: 60060.17 ms Billed Duration: 60000 ms Memory Size: 128 MB Max Memory Used: 76 MB Init Duration: 426.53 ms  
2020-09-23T07:39:34.660Z 02e2f7cb-817d-4e49-90db-5b4cae5c9336 Task timed out after 60.06 seconds
[INFO] 2020-09-23T07:39:35.55Z  Found credentials in environment variables. 
[INFO] 2020-09-23T07:39:35.94Z  Success: Connected to MySql db 
START RequestId: 02e2f7cb-817d-4e49-90db-5b4cae5c9336 Version: $LATEST 
{'CodePipeline.job': {'id': '9a8b13ea-d4f8-4aea-8481-60db0b7b5b5d',... snip} 
Dropping db 
Creating db 
Db created 
Conection closed 
[INFO] 2020-09-23T07:41:39.974Z 02e2f7cb-817d-4e49-90db-5b4cae5c9336 Job id 9a8b13ea-d4f8-4aea-8481-60db0b7b5b5d 
successfuly done 
END RequestId: 02e2f7cb-817d-4e49-90db-5b4cae5c9336 
REPORT RequestId: 02e2f7cb-817d-4e49-90db-5b4cae5c9336 Duration: 60060.32 ms Billed Duration: 60000 ms Memory Size: 128 MB Max Memory Used: 30 MB  
2020-09-23T07:42:39.925Z 02e2f7cb-817d-4e49-90db-5b4cae5c9336 Task timed out after 60.06 seconds 

我如何“强制”lambda 向 codepipeline 报告工作是否已完成,而不仅仅是 运行 在某种循环中?

Lambda IAM 角色附加了如下策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:Describe*",
                "ssm:Get*",
                "ssm:List*",
                "kms:Decrypt",
                "ssm:GetParametersByPath",
                "ec2:DescribeNetworkInterfaces",
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeInstances",
                "ec2:AttachNetworkInterface",
                "codepipeline:PutJobSuccessResult",
                "codepipeline:PutJobFailureResult"
            ],
            "Resource": "*"
        }
    ]
}

请帮忙,因为我找不到 lambda 不“告知”管道作业状态的原因。

因此要么创建 codepipline vpc 端点,要么将 lambda 移动到专用网络...案例已解决:)。