【问题标题】:Trying to connect to Boto3 Client from AWS Lambda and Receiving Timeout尝试从 AWS Lambda 连接到 Boto3 客户端并接收超时
【发布时间】:2020-08-29 14:17:46
【问题描述】:

当我在 Amazon Virtual Private Cloud (Amazon VPC) 之外运行时,我的 AWS Lambda 函数代码运行良好。但是,当我将函数配置为连接到 VPC 时,我收到函数超时错误。我该如何解决这些问题?

def get_db_connection_config():
    # Create a Secrets Manager client.
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    # In this sample we only handle the specific exceptions for the 'GetSecretValue' API.
    # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
    # We rethrow the exception by default.

    try:
        logger.info("Retrieving MySQL database configuration...")
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )

    except ClientError as error:
        logger.error(error)
        sys.exit()

    else:
        # Decrypts secret using the associated KMS CMK.
        # Depending on whether the secret is a string or binary, one of these fields will be populated.
        if 'SecretString' in get_secret_value_response:
            secret = get_secret_value_response['SecretString']
            return json.loads(secret)
        else:
            return base64.b64decode(get_secret_value_response['SecretBinary'])

【问题讨论】:

    标签: python amazon-web-services aws-lambda boto3


    【解决方案1】:

    当 Lambda 驻留在 AWS 网络中时,它能够使用互联网连接到这些服务,但是一旦它加入您的 VPC,出站互联网流量也将通过您的 VPC 进行路由。由于可能没有出站互联网连接,Lambda 无法访问互联网。

    如果您的函数需要访问互联网,请使用网络地址转换 (NAT)。将函数连接到公共子网不会为其提供 Internet 访问权限或公共 IP 地址。

    为了让您的 Lambda 在 VPC 中能够与其他 AWS 服务通信,必须具备以下条件之一。

    第一个选项是您创建 NAT gatewayNAT instance,然后将其添加到您的 Lambda 所在的 route table 中。要明确的是,此子网应该是私有子网,仅通过使用0.0.0.0/0 记录的 NAT 将阻止到具有共享同一子网的公共 IP 地址的实例的入站流量。

    第二个选项是您将VPC endpoints 用于服务,通过这样做,之前通过公共互联网的任何流量将改为使用直接连接到 AWS 服务本身的私有连接。请注意,尚未涵盖所有 AWS 服务。

    【讨论】:

    • 谢谢,这对我有帮助。在我尝试在公共子网(0.0.0.0/0 -> igw + 自动分配公共 ip)上放置 lambda 之前,lambda 仍然无法从秘密管理器中获取(超时)。你知道为什么吗?我在想可能是子网无法为 lambdas 自动分配公共 ip。
    • 有点老问题,但要添加我的 2c,是的,这正是我在我的经验中看到的。一旦我将 Lambda 函数放置在 VPC 中,该函数就无法获取公共 IP,除非您跳转到前面描述的环节(将 Lambda 设置在私有子网中并将所有流量路由到 NAT)还记得授予所有这是您的执行角色:*“ec2:CreateNetworkInterface”*“ec2:DescribeNetworkInterfaces”*“ec2:DeleteNetworkInterface”*“ec2:AssignPrivateIpAddresses”*“ec2:UnassignPrivateIpAddresses”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2022-11-05
    • 2020-09-12
    相关资源
    最近更新 更多