Lambda 在上传到 S3 时挂起,而从本地服务器上传则工作正常

问题描述 投票:0回答:1

lambda 位于公共子网中,但无论如何 S3 存储桶都是公共的。

lambda 具有 FullS3Access IAM 角色,我尝试在我的 VPC 中为 S3 创建端点,但无济于事。

存储桶唯一的自定义权限是一条语句,允许每个人从中获取对象。

这是它挂起的代码片段:

s3 = boto3.client(
        "s3",
        region_name=variables.secrets.AWS_REGION_NAME,
        aws_access_key_id=variables.secrets.AWS_ACCESS_KEY_ID,
        aws_secret_access_key=variables.secrets.AWS_SECRET_ACCESS_KEY,
    )
    logger.debug("Connected to boto client")

    bucket_name = "user-images"
    file_name = f"public_{uuid4()}.{image.filename.split('.')[-1]}"

    try:
        logger.debug("Uploading file to s3...")
        s3.upload_fileobj(
            image.file,
            bucket_name,
            file_name,
            ExtraArgs={
                "ContentType": image.content_type,
            },
        )
        logger.debug("File uploaded to s3")
    except Exception as e:
        logger.error(str(e))
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=str(e),
        )

我得到的最后一个调试语句是“正在将文件上传到 S3...”,之后它会无限期挂起。

该文件为 60 kb,因此不应是带宽或硬件相关问题。

也许最重要的是,在本地主机上运行服务器可以很好地上传到 S3,没有任何问题。

为什么会出现这种情况?

python python-3.x amazon-web-services amazon-s3 boto3
1个回答
0
投票

如果您的 Lambda 函数并不严格需要访问 VPC 中的私有资源,则不要将其配置为 VPC。这样,您就可以自动路由到互联网和 AWS 服务端点(这实际上是由 AWS Lambda 服务完成的。因为您的 Lambda 函数从技术上讲是在 Lambda 服务 VPC 内的计算实例上运行,并且该服务 VPC 内置了路由和 NAT中)。

如果您的 Lambda 函数确实需要访问 VPC 中的私有资源,例如RDS 数据库或 Elasticsearch 集群,然后为 VPC 配置 Lambda 函数并将其放置在私有子网中。请注意,HA 最佳实践是多个私有子网,跨越多个可用区以实现可用性。不要使用公共子网 - 您的 Lambda 函数没有公共 IP,因此从它流向公共端点的任何流量都将在 IGW 处被丢弃。

如果您的 Lambda 函数需要访问 AWS 服务端点,那么您可以通过 VPC 端点或通过到 VPC 公有子网中的 NAT 设备(或 NAT 网关)的子网路由(当然,它必须具有 IGW)来执行此操作.

© www.soinside.com 2019 - 2024. All rights reserved.