我正在尝试从AWS Lambda中的s3下载文件。
有一个Web服务将s3元数据(键,存储桶)推送到SQS。我有一个lambda,可以下载文件并将其内容推入elasticsearch。这是我的代码:
import config
def push_data(event, context):
try:
_push_data(event, context)
except Exception as e:
print("Exception raised %s" % e)
def _push_data(event, context):
files_data = get_files_data(event)
for file_data in files_data:
is_success, data = push_file(
index=file_data["index"], file_bucket=file_data["file_bucket"],
file_key=file_data["file_key"]
)
if is_success:
call_post_push(file_data[0], data)
def push_file(index, file_bucket, file_key):
start_time = datetime.datetime.now()
print("I have started downloading %s" % start_time)
file_path = '/tmp/a.xlsx'
# download file from s3
client = boto3.client(
's3',
aws_access_key_id=config.AWS_ACCESS_KEY_ID,
aws_secret_access_key=config.AWS_SECRET_ACCESS_KEY,
)
client.download_file(Bucket=file_bucket, Key=file_key, Filename=file_path)
#
# contains code to push file contents to s3
print("Finished")
lambda执行时,在打印I have started downloading ..
后超时。
做以上所有事情都无济于事。请让我知道如何解决此问题,或者是否还有其他需要检查的内容。
答案 0 :(得分:0)
问题是lambda函数无法访问公共互联网,并且无法访问S3 API端点。 Nat网关最有可能不在公共子网中,这意味着nat网关不在以Internet网关作为默认路由的子网中。
要解决此问题,请在公共子网中构建nat网关,并将其用作lambda函数的默认路由,或为S3添加VPC端点。将此VPCE用作包含lambda函数的子网的路由表中的下一个路由。
https://docs.aws.amazon.com/vpc/latest/userguide/vpce-gateway.html