Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Building a serverless application with AWS

mingrammer
September 27, 2017

Building a serverless application with AWS

How to build a simple image resizing service based on serverless architecture with AWS

mingrammer

September 27, 2017
Tweet

More Decks by mingrammer

Other Decks in Programming

Transcript

  1. S3 + Lambda + API Gatewayܳ ഝਊೠ ࢲߡܻझ ࢲ࠺झ ѐߊೞӝ
    MinJae Kwon (@mingrammer)
    2017.08.29 AWSKRUG Architecture
    (Make a serverless on-demand image resizing service)

    View full-size slide

  2. Name
    ӂ޹੤ (MinJae Kwon)
    Nickname
    @mingrammer
    Email
    [email protected]
    Who
    Game Server Engineer @ SundayToz
    Blog
    https://mingrammer.com
    Facebook
    https://facebook.com/mingrammer
    Github
    https://github.com/mingrammer
    Eng Blog
    https://medium.com/@mingrammer

    View full-size slide

  3. Serverless ୡә੗ܳ ؀࢚ਵ۽ ೤פ׮

    View full-size slide

  4. 2. On-demand image resizing
    4. Result & Review
    3. Building a service with AWS
    Contents
    1. Serverless?

    View full-size slide

  5. Serverless?
    By Server Engineers
    Dist
    EC2
    EC2
    Cache
    Dist
    EC2
    EC2
    Cache
    Client
    Client
    API Code
    API Code
    By AWS

    View full-size slide

  6. Serverless?
    Dist
    EC2
    EC2
    Cache
    Dist
    EC2
    EC2
    Cache
    Client
    Client
    API Code
    API Code
    By Server Engineers
    By AWS
    have to manage entire architectures and logics
    focus on logics

    View full-size slide

  7. Serverless?
    Amazon API
    Gateway
    AWS
    Lambda
    +
    Amazon

    S3
    +
    Amazon
    Kinesis
    Amazon

    DynamoDB
    Amazon

    SNS


    View full-size slide

  8. On-demand image resizing
    On-demand image resizing service?

    View full-size slide

  9. On-demand image resizing
    Resizing
    Server
    image resized
    User Service
    desired parameters
    new
    image

    View full-size slide

  10. On-demand image resizing
    ੉޷૑ܳ ޷ܻ ࢤࢿ೧ف૑ ঋইب ؽ
    ׮নೠ ࢎ੉ૉ੄ ੉޷૑ܳ ೙ਃೡ ٸ ࢤࢿೡ ࣻ ੓਺
    ੉޷૑ ୊ܻ ো࢑ਸ ݫੋ ۽૒җ ܻ࠙ೡ ࣻ ੓਺
    ׮ࣻ੄ ੉޷૑ ୊ܻ ো࢑ী ٮܲ ஹೊ౴ ࢿמ੄ ਬز੸ੋ झாੌ݂

    View full-size slide

  11. On-demand image resizing
    Why Serverless?

    View full-size slide

  12. On-demand image resizing
    ੉޷૑ ਃ୒ী ؀ೠ ౟ې೗ ৘ஏ੉ য۰਑
    ౠࣻ ӝמਸ ਤೠ ৮੹ೠ ױੌ ੋझఢझ ࢎਊ਷ ࠺ਊ ࠺ബਯ੸੉ۄ ౸ױ
    ࢲߡ ҙܻ ࠁױ ࢲ࠺झ ѐߊী݅ ૘઺ೞҊ र਺

    View full-size slide

  13. Amazon

    S3
    Amazon API
    Gateway
    AWS
    Lambda
    users
    resizing
    Architecture
    On-demand image resizing

    View full-size slide

  14. Architecture with deploy process
    On-demand image resizing (advanced)
    Amazon

    S3
    Amazon API
    Gateway
    AWS
    Lambda
    users
    resizing
    AWS IAM
    deploy
    Python (boto)

    View full-size slide

  15. Building a service with AWS
    Amazon

    S3

    View full-size slide

  16. Building a service with AWS
    Amazon

    S3

    View full-size slide

  17. Building a service with AWS
    AWS
    Lambda
    Amazon

    S3

    View full-size slide

  18. Building a service with AWS
    AWS
    Lambda
    handler
    def lambda_handler(event, context)
    Check existence of a resized image
    Get a resized image
    Put a resized image
    Resize an image
    Generate an thumbnail link
    Amazon

    S3
    resizer code

    View full-size slide

  19. Building a service with AWS
    Amazon API
    Gateway
    AWS
    Lambda
    handler
    def lambda_handler(event, context)
    Check existence of a resized image
    Get a resized image
    Put a resized image
    Resize an image
    Generate an thumbnail link
    Amazon

    S3
    resizer code

    View full-size slide

  20. Building a service with AWS
    Set up IAM
    Lambda / S3 / API Gatewayܳ ҙܻೡ ࣻ ੓ח ুࣁझ ӂೠਸ ೡ׼

    View full-size slide

  21. Building a service with AWS
    Set up S3 bucket
    ੐੄੄ ੉޷૑ ੷੢ ҃۽ ࢤࢿ
    ੉ ҃۽ীࢲ੄ ӏ஗਷ mingrammer/{sub}/{category}/{filename}

    View full-size slide

  22. Building a service with AWS
    Set up S3 bucket
    S3 Bucket Policy ࢸ੿
    {
    "Version": "2008-10-17",
    "Id": "Policy1335892530063",
    "Statement": [
    {
    "Sid": "Stmt1335892150622",
    "Effect": "Allow",
    "Principal": {
    "AWS": "arn:aws:iam::386209384616:root"
    },
    "Action": [
    "s3:GetBucketAcl",
    "s3:GetBucketPolicy"
    ],
    "Resource": "arn:aws:s3:::mingrammer"
    },
    {
    "Sid": "Stmt1335892526596",
    "Effect": "Allow",
    "Principal": {
    "AWS": "arn:aws:iam::386209384616:root"
    },
    "Action": “s3:PutObject",
    "Resource": "arn:aws:s3:::mingrammer/*"
    },
    {
    "Sid": "PublicReadGetObject",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::mingrammer/*"
    }
    ]
    }

    View full-size slide

  23. Building a service with AWS
    Write Lambda handler function
    def lambda_handler(event, context):
    sub = event.get('sub')
    category = event.get('category')
    filename = event.get('filename')
    width = event.get('width')
    # Check if the image url with given parameter exists
    # If the format of image is not supported, redirect to original image
    with Image(file=original_image['Body']) as img:
    # If width is not set, get width of original image
    # Check if the width is valid numeric value
    # If the thumbnail already exists, redirect to that
    # Image resizing
    ]
    event.get('field') ?

    View full-size slide

  24. Building a service with AWS
    Write Lambda handler function
    ../{sub}/{category}/{filename}?width=400 Amazon API
    Gateway
    AWS
    Lambda
    API Gateway੄ Mapping Templateীࢲ Lambda۽ ౵ۄ޷ఠܳ ֈѹષ

    View full-size slide

  25. Building a service with AWS
    Write Lambda handler function
    event.get('field')
    Amazon API
    Gateway
    AWS
    Lambda
    Amazon

    S3
    Valid? Format check Param check
    Amazon

    S3
    Exists? Resize Save
    Amazon

    S3
    original thumbnail
    Get object Get object Put object

    View full-size slide

  26. Building a service with AWS
    Upload Lambda handler function

    View full-size slide

  27. Building a service with AWS
    Upload Lambda handler function
    ੉޷૑ ୊ܻܳ ਤೠ wand ۄ੉࠳۞ܻ৬ ೩ٜ۞ ೣࣻо ನೣػ ౵ੌਸ ೣԋ ঑୷
    zip -R thumbnailer.zip wand/* generator.py

    View full-size slide

  28. Building a service with AWS
    Upload Lambda handler function

    View full-size slide

  29. Building a service with AWS
    Upload Lambda handler function

    View full-size slide

  30. Building a service with AWS
    Upload Lambda handler function
    Lambda ೣࣻо ࢿҕ੸ਵ۽ ࢤࢿؽ

    View full-size slide

  31. Building a service with AWS
    (+) thumbnailerۄח IAM Role੉ Lambdaীࢲ
    S3ܳ ઁযೡ ࣻ ੓ب۾ IAMীࢲ Policyܳ ୶о೧઻ঠೣ
    Setup Permissions

    View full-size slide

  32. Building a service with AWS
    Attach Policyীࢲ AmazonS3FullAccessܳ ୶о
    Setup Permissions

    View full-size slide

  33. Building a service with AWS
    Set up API Gateway with Lambda

    View full-size slide

  34. Building a service with AWS
    Set up API Gateway with Lambda
    /mingrammer/{sub}/{category}/{filename}੉ۄח ߡఉ ೞਤ ҃۽ ӏ஗ী ݏѱ ܻࣗझܳ ࢤࢿ

    View full-size slide

  35. Building a service with AWS
    Set up API Gateway with Lambda
    /mingrammer/{sub}/{category}/{filename}੉ۄח ߡఉ ೞਤ ҃۽ ӏ஗ী ݏѱ ܻࣗझܳ ࢤࢿ
    ҃۽ ੗୓ܳ Object ఃчਵ۽ ࢸ੿೧ S3۽੄ ૒੽ ੽Ӕҗ زੌೠ ੽Ӕ ߑधਸ ஂೞӝ ਤೣ
    ( {variable}਷ ҃۽ ߸ࣻܳ ڷೣ )

    View full-size slide

  36. Building a service with AWS
    Set up API Gateway with Lambda
    {/filenamae} ҃۽ীࢲ ݫࢲ٘ ࢤࢿਸ ࢶఖೠ റ GET ݫࢲ٘ܳ ࢤࢿ

    View full-size slide

  37. Building a service with AWS
    Set up API Gateway with Lambda
    {/filenamae} ҃۽ীࢲ ݫࢲ٘ ࢤࢿਸ ࢶఖೠ റ GET ݫࢲ٘ܳ ࢤࢿ
    /mingrammer/{sub}/{category}/{filename} ੹୓ ҃۽ী ؀೧ API ݫࢲ٘ܳ ੿੄ೡ ࣻ ੓਺

    View full-size slide

  38. Building a service with AWS
    Set up API Gateway with Lambda
    ࢤࢿೠ GET ݫࢲ٘ী ખ ੹ী ݅ٚ thumbnailۄח Lambda ೣࣻܳ োѾ

    View full-size slide

  39. Building a service with AWS
    Set up API Gateway with Lambda
    /mingrammer/{sub}/{category}/{filename}੉ۄח API ূ٘ನੋ౟ী Lambda ೣࣻо ࢿҕ੸ਵ۽ োѾؽ

    View full-size slide

  40. Building a service with AWS
    Set up API Gateway with Lambda
    ੉޷૑ ܻࢎ੉૚ਸ ਤ೧ [ݫࢲ٘ ਃ୒]ীࢲ widthۄח ౵ۄ޷ఠܳ ߉ਸ ࣻ ੓ب۾ URL (GET) ௪ܻ ౵ۄ޷ఠ ୶о

    View full-size slide

  41. Building a service with AWS
    Set up API Gateway with Lambda
    ઁ؀۽ ز੘ೞח૑ ഛੋ ೞӝ ਤ೧ [పझ౟]ী ٜযо ੸੺ೠ ҃۽ ߸ࣻ৬ ௪ܻ ౵ۄ޷ఠܳ ֍Ҋ పझ౟
    None ??

    View full-size slide

  42. Building a service with AWS
    Set up API Gateway with Lambda
    ҃۽ ߸ࣻܳ ੸੺൤ ࢸ੿೮਺ীب None੉ۄח ч੉ ٜযоҊ ੓਺
    API Gatewayীࢲ Lambda۽ context ੉৻੄ ୶о੸ੋ ౵ۄ޷ఠܳ ੹׳ೞӝ ਤ೧ࢶ
    Mapping Templatesܳ ࢸ੿೧ঠೣ
    Lambda۽ ੘সਸ ਃ୒ೞӝ ੹ API Gatewayী ٜযয়Ѣա ઓ੤ೞח ߸ٜࣻਸ JSON ഋక۽ ݒೝೞৈ ੹׳

    View full-size slide

  43. Building a service with AWS
    Set up API Gateway with Lambda
    [ా೤ ਃ୒]ী ٜযоݶ ࠄޙ ݒೝ ప੉࠶੉ۄח ೦ݾীࢲ ୶оೡ ࣻ ੓਺

    View full-size slide

  44. Building a service with AWS
    Set up API Gateway with Lambda
    sub, category, filename, width ౵ۄ޷ఠܳ ߉ই৬ пп JSON ఃчਵ۽ ݒೝೣ

    View full-size slide

  45. Building a service with AWS
    Set up API Gateway with Lambda
    ౵ۄ޷ఠٜ੉ ઁ؀۽ ੹׳غয ੿࢚੸ਵ۽ ز੘ೞৈ ߸ജػ ੉޷૑੄ URL੉ ߈ജؽ

    View full-size slide

  46. Building a service with AWS
    Set up API Gateway with Lambda
    S3ীࢲ ߸ജػ ੉޷૑ܳ ഛੋೞৈ ઁ؀۽ ੜ ز੘ೣਸ ഛੋ

    View full-size slide

  47. Building a service with AWS
    Set up API Gateway with Lambda
    పझ౟ܳ ֈয पઁ۽ ࢎਊೡ ࣻ ੓ب۾ APIܳ ߓನ

    View full-size slide

  48. Building a service with AWS
    Set up API Gateway with Lambda
    ݒ਋ ࣚऔѱ ߓನо ৮ܐؽ

    View full-size slide

  49. Building a service with AWS
    Set up API Gateway with Lambda
    ߓನػ APIо ੜ ز੘਷ ೞա ઑӘ ੉࢚ೣ .. ࢚ध੸ਵ۽ח ੉޷૑੄ Location ੿ࠁ ؀न Redirectػ पઁ ੉޷૑о ա৬ঠೣ
    (ਤ੄ Response ഋध਷ Defaultо ইפݴ Lambdaীࢲ ੉޷૑ ߸ജ੉ ՘դ റ, ਤ੄ ഋక۽ Responseܳ ٜ݅য ղ۰ળѢ੐)

    View full-size slide

  50. Building a service with AWS
    Set up API Gateway with Lambda
    [ݫࢲ٘ ਽׹]ীࢲ Body۽ ڄয૑ח Locationਵ۽ Redirectionਸ ೞӝ ਤ೧ Locationҗ Status ೻؊ܳ ୶о

    View full-size slide

  51. Building a service with AWS
    Set up API Gateway with Lambda
    ӒܻҊ [ా೤ ਽׹]ীࢲ Locationҗ Status ೻؊ী Body۽ ڄয૑ח чٜਸ ݒೝೣ

    View full-size slide

  52. Building a service with AWS
    Call the Lambda based API
    APIܳ ੤ߓನ ೠ റ ਗೞח widthчҗ ೣԋ APIܳ ੤ഐ୹ ೞݶ Body ؀न Locationਵ۽ Redirectػ ੉޷૑ܳ ߄۽ ࠅ ࣻ ੓਺

    View full-size slide

  53. Result & Review
    ੢੼ ױ੼
    ࢲߡ ҙܻী ؀ೠ Ҋ޹੉ ೙ਃহয૗
    ੹୓੸ੋ ೒۽਋ ࣇস੉ ए਑
    ೟ण ࠺ਊ੉ ֫૓ ঋਵա হ૑ب ঋ਺
    ୡࠁ ੑ੢ীࢶ ҳഅ ৻੄ AWSী ؀ೠ
    ӝࠄ੸ੋ ૑ध੉ ਃҳؽ
    ѐߊ/ߓನ/ࢸ੿੉ ݒ਋ рױೞҊ ࡅܴ

    View full-size slide

  54. хࢎ೤פ׮
    MinJae Kwon (@mingrammer)
    2017.09.27 AWSKRUG Architecture
    (Make a serverless on-demand image resizing service)

    View full-size slide