이상을 꿈꾸는 몽상가.. 프로그래밍을 좋아함..


Sample Json Of AWS Events

AWS를 활용하다보면 Event-Driven-Programing 방식으로 시스템 제어를 쉽게 시도할 수 있습니다.

가장 잘 알려진 예로 이미지 썸네일 생성이 있겠죠.
S3에 이미지가 업로드 이벤트가 발생되면 정해둔 몇몇의 Lambda들에게 event를 알립니다.
어떤 Lambda는 썸네일(thumbnail)을 생성하고, 다른 Labmda는 DB작업을 하고, 또 다른 Lambda는 로깅을 진행합니다.

저는 주로 S3와 DynamoDB의 이벤트 알림을 주로 활용하고 있습니다.
그외 많은 AWS 제품에서도 이벤트 알림을 제공해줄 것입니다.

근데 AWS 이벤트 알림을 사용하다보면 (이제 본론입니다…)
발생한 이벤트의 내용을 json으로 받게 됩니다.
그 json 에 대한 sample을 몇가지 모아서 기록할 예정입니다.


AWS 홈페이지에서 그 json 규격에 대한 문서가 있을만한데 저는 못찾겠더군요.
예전에 한번 찾았던 것 같기도한데.. 게을러져서인지.. 어쨋든 지금은 못 찾겠습니다.

그 대신 필요한 이벤트를 임의로 발생시켜보고
전달받은 json을 로깅해서 대략적인 규격을 파악하고 개발을 진행하고 있습니다.

근데 매번 반복 작업을 하는 것 같아서 json sample을 기록해보려고 합니다.

How To Log Jsons

일단 Lambda에서 어떤 방법으로 로깅을 했는지 알려드립니다.
사용한 language는 Python3.6 입니다.


import json

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context) :
    
  logger.info("event : {}".format(json.dumps(event)))

예를들어 S3 이벤트에 대한 Lambda를 작성 후 테스트를 하려면
자신의 정확한 S3 bucket 정보가 담긴 json sample이 필요하실 것이기 때문에 로깅은 한번쯤 필요합니다.

S3

S3 PUT Object

{
    "Records": [
        {
            "eventVersion": "2.0",
            "eventSource": "aws:s3",
            "awsRegion": "ap-northeast-1",
            "eventTime": "2018-03-23T13:44:30.435Z",
            "eventName": "ObjectCreated:Put",
            "userIdentity": {
                "principalId": "AWS:ADODJMDYWAJBJ27QIESKM:name_of_evnet_receiver_like_lambda"
            },
            "requestParameters": {
                "sourceIPAddress": "111.111.111.111"
            },
            "responseElements": {
                "x-amz-request-id": "D4418A1F738543E9",
                "x-amz-id-2": "FujFIZnM73L7eNSTs3pWc4FJcOmBKFQgJuaAEhglnxMgC41pFJgcCEcM2NGKQmwKlTO/5+OdMeE="
            },
            "s3": {
                "s3SchemaVersion": "1.0",
                "configurationId": "event_name_which_you_wrote_in_s3", 
                "bucket": {
                    "name": "s3_bucket_name",
                    "ownerIdentity": {
                        "principalId": "A24O2D1DIXWWMU"
                    },
                    "arn": "arn:aws:s3:::s3_bucket_name"
                },
                "object": {
                    "key": "key_of_s3_object",
                    "size": 61662,
                    "eTag": "d275d454cffddb8e946197554715f38d",
                    "sequencer": "005AB504BX5D1W1FF2"
                }
            }
        }
    ]
}

CloudWatch Events

{ 
  "version": "0", 
  "id": "2de27334-3716-fy7e-5x43-dwf1a5ac5447", 
  "detail-type": "Scheduled Event", 
  "source": "aws.events", 
  "account": "141855812477", 
  "time": "2018-04-03T16:07:58Z", 
  "region": "ap-northeast-1", 
  "resources": ["arn:aws:events:ap-northeast-1:141855812477:rule/scheduled_event_name_which_you_wrote"], 
  "detail": {}
}

Dynamo DB

Dynamo DB Insert

boto3 모듈의 UpdateItem 으로 입력했습니다.
실제 update가 아닌 insert가 발생한다면 eventName이 Insert로 내려오네요.


{
    "Records": [
        {
            "eventID": "ccdc9732e4ad93fc6d1283d850567b66",
            "eventName": "INSERT",
            "eventVersion": "1.1",
            "eventSource": "aws:dynamodb",
            "awsRegion": "ap-northeast-1",
            "dynamodb": {
                "ApproximateCreationDateTime": 1523182120,
                "Keys": {
                    "key1": {
                        "S": "value"
                    },
                    "key2": {
                        "S": "value"
                    }
                },
                "NewImage": {
                    "key1": {
                        "S": "value"
                    },
                    "key2": {
                        "S": "value"
                    },
                    "column1": {
                        "S": "column1 value"
                    },
                    "column12": {
                        "N": "column2 value"
                    }
                },
                "SequenceNumber": "159997200000000018442001308",
                "SizeBytes": 200,
                "StreamViewType": "NEW_AND_OLD_IMAGES"
            },
            "eventSourceARN": "arn:aws:dynamodb:ap-northeast-1:141855812477:table/your_table_name/stream/2018-03-21T14:31:59.473"
        }
    ]
}

Dynamo DB Delete

boto3 모듈의 DeleteItem 으로 입력했습니다. eventName은 REMOVE 이네요.


{
    "Records": [
        {
            "eventID": "ccdc9732e4ad93fc6d1283d850567b66",
            "eventName": "REMOVE",
            "eventVersion": "1.1",
            "eventSource": "aws:dynamodb",
            "awsRegion": "ap-northeast-1",
            "dynamodb": {
                "ApproximateCreationDateTime": 1523182120,
                "Keys": {
                    "key1": {
                        "S": "value"
                    },
                    "key2": {
                        "S": "value"
                    }
                },
                "OldImage": {
                    "key1": {
                        "S": "value"
                    },
                    "key2": {
                        "S": "value"
                    },
                    "column1": {
                        "S": "column1 value"
                    },
                    "column12": {
                        "N": "column2 value"
                    }
                },
                "SequenceNumber": "159997200000000018442001308",
                "SizeBytes": 200,
                "StreamViewType": "NEW_AND_OLD_IMAGES"
            },
            "eventSourceARN": "arn:aws:dynamodb:ap-northeast-1:141855812477:table/your_table_name/stream/2018-03-21T14:31:59.473"
        }
    ]
}


Donations ❤

제가 작성한 글이 작게라도 도움이 되었기를 바랍니다.
관심 가져주시는 분이 있는 것을 느끼고 힘내기 위해 기부 버튼을 만들어봤습니다.
혹시 가능하시다면 $1 라도 기부 부탁드립니다 ^^





Associated Posts

관련된 주제를 살펴볼 수 있도록 동일한 Tag를 가진 글들을 모아뒀습니다. 제목을 눌러주세요.

  • AWS를 사용하면서 겪은 트러블슈팅 (DNS 기반 HA 관련 이슈)


    AWS 구성

    AWS를 이용해서 프로젝트를 진행하면서 겪은 트러블슈팅 중
    DNS 기반 HA 구성과 관련 된 두가지 트러블슈팅에 대해서 공유합니다.

    Apache HTTPD와 ELB를 함께 사용하면서 주기적으로 14초정도의 응답지연건이 발생했던 건과
    Aurora DB fail-over에 걸리는 시간을 최대한 줄여봤지만 3초정도의 한계가 있었던 건에 대해서 공유하겠습니다.


  • Resizing Images On AWS Lambda


    AWS Lambda
    (이미지 출처 : https://aws.amazon.com/ko/lambda/features/)

    고양이 방울(Belling The Cat) 앱을 구현하는 과정에서
    AWS S3에 업로드 된 이미지의 크기를 리사이징하는 내용을 다뤘습니다.
    (깨알같은 앱 홍보)

    AWS Lambda 위에서 구현됐고 Python PIL(Pillow) 라이브러리를 이용했습니다. 그 내용에 대해서 공유합니다.
    그리고 그 과정에서 만들어진 PIL 라이브러리를 포함한 ZIP 샘플을 공유드립니다.


  • Deploying Python Zip To AWS Lambda


    AWS Lambda Python
    (이미지 출처 : https://aws.amazon.com/ko/lambda/features/, https://www.python.org/)

    주로 Python 언어로 AWS Lambda를 유용하게 사용하고 있습니다.

    AWS Lambda에서 제공하는 몇몇 Python 기본 라이브러리만 사용해서 코딩을 한다면 신경쓰지 않아도 되지만
    기본 제공되지 않는 라이브러리를 사용하려면 작성한 Python 소스파일(.py)와 필요한 라이브러리를 Zip 파일로 묶어서 AWS Lambda에 올려야합니다.



Disqus Social Community

SNS계정으로 댓글을 달아도 SNS에 글이 남지 않습니다.
이메일 주소 입력으로 글을 남길 수 있으며, 답변이 달리면 이메일로 알림을 받을 수 있습니다.

i