0
こんにちは私は、ラムダがS3のファイルアクセス権を持つ役割を果たしているにもかかわらず、S3からファイルを読み込めない以下のラムダ(python3.6)を持っています(IAMポリシー以下)。AWSラムダがS3からファイルを取得できない
Lambdaは単にS3からファイルを取得し、一時的な場所に書き込もうとします。しかし、それはs3.Bucket()
を呼び出してブロックされ、タイムアウトになります(分単位のタイムアウトがあっても)。
本当に奇妙なのは、例外なくタイムアウトしていて、何らかの種類の許可エラーでs3.Bucket()
への呼び出しを拒否していないということです。
これはかなり基本的なものですが、私はこれを分類することができません。役割があることを
import boto3
from botocore import exceptions
def lambda_handler(event, context):
key = event['image']
bucket = event['bucket']
tempfile = '/tmp/%s-%s' % (bucket, key)
print('(p) bucket: %s::%s' % (bucket, key))
print('(p) tempfile: %s' % tempfile)
s3 = boto3.resource('s3')
print('(p) resource intiialized')
try:
b = s3.Bucket(bucket)
print('(p) bucket info: %s [%s]' % (b.name, b.creation_date))
b.download_file(prefixed_key, tempfile)
print('(p} file downloaded to %s' % tempfile)
except exceptions.ParamValidationError as e:
return {"statusCode": 400, "body": 'ParamValidationError: [%s]' % e}
except exceptions.ClientError as e:
message = '[%s]: [%s]' % (e.response['Error']['Code'], e.response['Error']['Message'])
return {"statusCode": e.response['ResponseMetadata']['HTTPStatusCode'], "body": message}
print('(p) image downloaded from s3 and stored at: %s' % tempfile)
return None
IAMポリシーは次のとおりです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my_bucket",
"arn:aws:s3:::my_bucket/*"
]
}
]
}
例ログ:
22:42:43
START RequestId: 61c60167-839d-11e7-97b1-a772bbde2609 Version: $LATEST
START RequestId: 61c60167-839d-11e7-97b1-a772bbde2609 Version: $LATEST
22:42:43
(p) bucket: my_bucket::my_key
22:42:43
(p) tempfile: /tmp/my_bucket/my_key
22:42:43
(p) resource intiialized
22:43:13
END RequestId: 61c60167-839d-11e7-97b1-a772bbde2609
END RequestId: 61c60167-839d-11e7-97b1-a772bbde2609
ラムダ関数自体がタイムアウトしていますか?機能のタイムアウトをデフォルトの3秒から増やしましたか?送信ネットワーク接続がないVPCで動作していますか? – jarmod
関数のタイムアウトを2分に設定しました。ラムダ自体がタイムアウトします。説明するためにいくつかのログ出力を追加しました。 –
例外メッセージの詳細は何ですか? 「イメージをダウンロード」というメッセージが表示されないので、その前に関数が返されている必要があります。そのシーケンスの唯一の戻り値は例外節にあります。 –