aws lambda로 크롤링을 하게 되었는데 의외로 boto3로 호출하는 방법이 잘 안나와 있어서 기록.
람다 함수 생성 등은 다른 블로그에도 많이 있으니 찾아보면 될 듯.
def event_handler(event, context):
name = event['name']
age = event['age']
return {'lambda_name': f'lambda {name}', 'lambda_age': age}
import boto3
import json
lambda_client = boto3.client('lambda',
region_name='ap-northeast-2',
aws_access_key_id='ACCESS_KEY_ID',
aws_secret_access_key='SECRET_ACCESS_KEY')
payload = {'name': 'foo', 'age': 20}
res = lambda_client.invoke(FunctionName='test-function',
InvocationType='RequestResponse', # RequestResponse외에도 Event 등이 있으니 필요에 따라 수정
Payload=json.dumps(payload))
여기서 res
의 값에는, 람다 함수에서 설정한 리턴값 + 메타데이터가 들어 있다.
(출처: https://stackoverflow.com/questions/58751026/getting-aws-lambda-response-when-using-boto3-invoke)
{'ResponseMetadata': {'RequestId': 'xxxxxxxxx', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Thu, 07 Nov 2019 14:28:25 GMT', 'content-type': 'application/json', 'content-length': '51', 'connection': 'keep-alive', 'x-amzn-requestid': 'xxxxxxxxxx', 'x-amzn-remapped-content-length': '0', 'x-amz-executed-version': '$LATEST', 'x-amzn-trace-id': 'root=xxxxxxxxx;sampled=0'}, 'RetryAttempts': 0}, 'StatusCode': 200, 'ExecutedVersion': '$LATEST', 'Payload': <botocore.response.StreamingBody object at 0x0000023D15716048>}
맨 마지막 'Payload'에 StreamingBody 타입으로 들어가 있으므로 필요한 Payload를 가져오려면 이를 read 해야 한다.
# 위 코드에 이어서 작성
data = json.loads(res['Payload'].read())
print(data)
>> {'lambda_name': 'lambda foo', 'lambda_age': 20}