Lambda

 

Lambda
서버를 프로비저닝 또는 관리하지 않고도 모든 유형의 애플리케이션와 백엔드 서비스에 대한 코드를 실행할 수 있는 이벤트 중심의 서버리스 컴퓨팅 서비스


Configuration

  1. 최대 10GB 임시 스토리지 할당 가능.
    • /tmp 에 할당.
    • File download 시, /tmp/{uuid.uuid4()}{file_name} 사용.
    • /tmp 이외의 경로에 접근 시, 자동으로 접근경로에 hash값이 추가되어 접근을 막는 것 같아보임.
  2. 최대 10GB 메모리 할당 가능.
  3. 기본 제한 시간은 3초이나 늘릴 수 있음.

⭐ Layer

  1. Layer: 라이브러리, 사용자 지정 런타임 또는 기타 종속 항목을 포함하는 ZIP 아카이브
  2. 배포 패키지에 라이브러리를 포함시킬 필요 없이, Layer를 통해 라이브러리를 사용가능.
  3. Layer에 포함된 콘텐츠들은 순서대로 /opt 에 추출됨.
  4. 동일한 파일이 여러 Layer에 나타나면, 마지막으로 적용된 Layer의 버전이 사용됨.
  5. 여러 라이브러리들을 Layer로 만들어놓은 repository를 활용하자.
  6. 직접 패키징을 하고 싶은 경우, 다음의 링크를 참고

Database

  1. Database account info 저장 방법
    1. 🔐 AWS Secrets Manager를 통해 DB 정보를 저장하는 것을 권장.
    2. 구성/환경 변수 에서 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를 통해 권한을 부여받아야함

  1. AWS Console을 이용하여 trigger를 생성하는 경우, 자동으로 resource-based policy가 생성됨.(Configuration/resource based policy)
  2. CLI로 trigger를 생성하는 경우, 몇 가지 직접 추가해야하는 작업이 있음.
    1. Resource-based policy 생성.
    2. Notification 생성.
      • Lambda function으로 notification을 날려주는 설정을 추가.
  3. 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