Lambda
서버를 프로비저닝 또는 관리하지 않고도 모든 유형의 애플리케이션와 백엔드 서비스에 대한 코드를 실행할 수 있는 이벤트 중심의 서버리스 컴퓨팅 서비스
Configuration
- 최대 10GB 임시 스토리지 할당 가능.
/tmp
에 할당.- File download 시,
/tmp/{uuid.uuid4()}{file_name}
사용. /tmp
이외의 경로에 접근 시, 자동으로 접근경로에 hash값이 추가되어 접근을 막는 것 같아보임.
- 최대 10GB 메모리 할당 가능.
- 기본 제한 시간은 3초이나 늘릴 수 있음.
⭐ Layer
- Layer: 라이브러리, 사용자 지정 런타임 또는 기타 종속 항목을 포함하는 ZIP 아카이브
- 배포 패키지에 라이브러리를 포함시킬 필요 없이, Layer를 통해 라이브러리를 사용가능.
- Layer에 포함된 콘텐츠들은 순서대로
/opt
에 추출됨. - 동일한 파일이 여러 Layer에 나타나면, 마지막으로 적용된 Layer의 버전이 사용됨.
- 여러 라이브러리들을 Layer로 만들어놓은 repository를 활용하자.
- 직접 패키징을 하고 싶은 경우, 다음의 링크를 참고
Database
- Database account info 저장 방법
- 🔐
AWS Secrets Manager
를 통해 DB 정보를 저장하는 것을 권장. 구성/환경 변수
에서 key, value 설정도 가능.
- 🔐
Event
Arguments
S3 Put
event
{ "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"ap-northeast-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"EXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"EXAMPLE123456789", "x-amz-id-2":"EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"BUCKET-NAME", "ownerIdentity":{ "principalId":"EXAMPLE" }, "arn":"arn:aws:s3:::BUCKET-NAME" }, "object":{ "key":"FILE-NAME", "size":1024, "eTag":"0123456789abcdef0123456789abcdef", "sequencer":"0A1B2C3D4E5F678901" } } } ] }
i
‘th s3 object
s3 = event['Records'][i]['s3']
- Bucket name
bucket_name = s3['bucket']['name']
- File name
file_name = unquote_plus(s3['object']['key'])
context
<__main__.LambdaContext object at 0x7f28dd4c6fa0>
Trigger
Resource-based policy
다른 AWS 서비스, 계정, 조직이 Lambda 함수를 실행시키기 위해서는 resource-based policy를 통해 권한을 부여받아야함
- AWS Console을 이용하여 trigger를 생성하는 경우, 자동으로 resource-based policy가 생성됨.(
Configuration/resource based policy
) - CLI로 trigger를 생성하는 경우, 몇 가지 직접 추가해야하는 작업이 있음.
- Resource-based policy 생성.
- Notification 생성.
- Lambda function으로 notification을 날려주는 설정을 추가.
- Link
CLI
Trigger
S3 Trigger
Configure Resource-based Policy
aws lambda add-permission \
--function-name FUNCTION-NAME \
--principal s3.amazonaws.com \
--statement-id s3invoke \
--action "lambda:InvokeFunction" \
--source-arn arn:aws:s3:::BUCKET-NAME \
--source-account ACCOUNT-ID
- Bucket의 이름은 global unique 하나 내가 bucket을 지우고, 다른 사람이 동일한 이름으로 만든 경우를 대비하여
account
까지 추가하는 것이 권장됨.
Add Notification Setting
notification.json
{ "LambdaFunctionConfigurations": [ { "Id": "CreateThumbnailEventConfiguration", "LambdaFunctionArn": "arn:aws:lambda:ap-northeast-2:ACCOUNT-ID:function:FUNCTION-NAME", "Events": [ "s3:ObjectCreated:Put" ] } ] }
aws s3api put-bucket-notification-configuration \
--bucket BUCKET-NAME \
--notification-configuration file://notification.json
Event
Define Event
dummyS3Event.json
{ "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"ap-northeast-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"BUCKET-NAME", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::BUCKET-NAME" }, "object":{ "key":"FILE-NAME", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
Invoke Function
aws lambda invoke \
--function-name CreateThumbnail \
--invocation-type RequestResponse \
--cli-binary-format raw-in-base64-out \
--payload file://dummyS3Event.json outputfile.txt
PREVIOUSEtc