{"id":506,"date":"2021-06-06T13:50:19","date_gmt":"2021-06-06T04:50:19","guid":{"rendered":"https:\/\/manvscloud.com\/?p=506"},"modified":"2021-06-06T13:53:38","modified_gmt":"2021-06-06T04:53:38","slug":"aws-image-resizing-failure","status":"publish","type":"post","link":"https:\/\/manvscloud.com\/?p=506","title":{"rendered":"[AWS] image resizing failure, trouble shooting"},"content":{"rendered":"\n<p>\uc548\ub155\ud558\uc138\uc694. ManVSCloud \uae40\uc218\ud604\uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc624\ub298\uc740 \uc774\uc804\uc5d0 \uc2e4\ud328\ud588\ub358 image resizing \uc2e4\ud328 \uc6d0\uc778\uc744 \ud655\uc778 \ud6c4 <br>\uc815\uc0c1\uc801\uc73c\ub85c resizing \uc131\uacf5 \ud6c4\uae30\ub97c \ub0a8\uaca8\ubcf4\ub824\uace0 \ud569\ub2c8\ub2e4.<\/p>\n\n\n<div class=\"vlp-link-container vlp-layout-basic wp-block-visual-link-preview-link\"><a href=\"https:\/\/manvscloud.com\/?p=423\" class=\"vlp-link\" title=\"[AWS] CLOUDFRONT + LAMBDA@EDGE\ub97c \ud65c\uc6a9\ud55c IMAGE RESIZING\" rel=\"nofollow\" target=\"_blank\"><\/a><div class=\"vlp-layout-zone-side\"><div class=\"vlp-block-2 vlp-link-image\"><img loading=\"lazy\" decoding=\"async\" style=\"max-width: 150px;\" width=\"150\" height=\"150\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2020\/09\/19011205\/pnghost_heart-heart_U0hjtp153g.png\" class=\"attachment-150x999 size-150x999\" alt=\"\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2020\/09\/19011205\/pnghost_heart-heart_U0hjtp153g.png 512w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2020\/09\/19011205\/pnghost_heart-heart_U0hjtp153g-300x300.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2020\/09\/19011205\/pnghost_heart-heart_U0hjtp153g-150x150.png 150w\" sizes=\"(max-width: 150px) 100vw, 150px\" \/><\/div><\/div><div class=\"vlp-layout-zone-main\"><div class=\"vlp-block-0 vlp-link-title\">[AWS] CLOUDFRONT + LAMBDA@EDGE\ub97c \ud65c\uc6a9\ud55c IMAGE RESIZING<\/div><div class=\"vlp-block-1 vlp-link-summary\">\uc548\ub155\ud558\uc138\uc694. ManVSCloud \uae40\uc218\ud604\uc785\ub2c8\ub2e4.<br \/>\n\uc624\ub298\uc740 CloudFront\uc640 Lambda@Edge\ub97c \ud65c\uc6a9\ud558\uc5ec \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc744 \ud574\ubcf4\ub824\ud569\ub2c8\ub2e4.<\/div><\/div><\/div>\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"has-white-color has-vivid-red-background-color has-text-color has-background wp-block-heading\">    First Cause<\/h3>\n\n\n\n<p>\uccab\ubc88\uc9f8 \uc6d0\uc778\uc744 \ucc3e\uc558\uc2b5\ub2c8\ub2e4.<br>CloudFront \ud2b8\ub9ac\uac70 \uad6c\uc131 \uc2dc Origin Response\uac00 \ub418\uc5b4\uc57c\ud558\ub294\ub370 Request\ub85c \uc124\uc815\uc744 \ud574\ub450\uc5c8\ub358 \uac83!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"757\" height=\"716\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015354\/2-01.png\" alt=\"\" class=\"wp-image-507\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015354\/2-01.png 757w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015354\/2-01-300x284.png 300w\" sizes=\"(max-width: 757px) 100vw, 757px\" \/><\/figure>\n\n\n\n<p>Lambda\uc5d0\uc11c \ubcc0\uacbd \uc2dc \uc704\uc5d0\uc11c \uc624\ub9ac\uc9c4 \uc751\ub2f5\uc73c\ub85c \ubcc0\uacbd\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"260\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015400\/2-02-1024x260.png\" alt=\"\" class=\"wp-image-508\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015400\/2-02-1024x260.png 1024w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015400\/2-02-300x76.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015400\/2-02-768x195.png 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015400\/2-02-1080x274.png 1080w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015400\/2-02.png 1122w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"240\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015407\/2-03.png\" alt=\"\" class=\"wp-image-509\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015407\/2-03.png 900w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015407\/2-03-300x80.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05015407\/2-03-768x205.png 768w\" sizes=\"(max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<p>\ub9cc\uc57d Cloudfront\uc5d0\uc11c \ubcc0\uacbd\uc744 \ud558\uc2e4 \uacbd\uc6b0 \uc5f0\uacb0\ub41c cloudfront\uc5d0\uc11c [Behaviors]-[\uacbd\ub85c \uc120\ud0dd \ubc0f Edit] \ud6c4 \uc544\ub798 CloudFront Event\uc5d0\uc11c Origin Response\ub85c \ubcc0\uacbd\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774 \ubd80\ubd84\uc740 \ub9ac\ub205\uc11c\ub2d8\uc758 \ub3c4\uc6c0\uc744 \ubc1b\uc558\uc2b5\ub2c8\ub2e4.<br>\ud574\ub2f9 \ubd80\ubd84\uc774 Response\uac00 \ub418\uc5b4\uc57c\ud558\ub294 \uc774\uc720\ub294 \uc778\uc9c0\ud558\uace0 \uc788\uc5c8\ub294\ub370 \ub2e4\uc2dc \ud55c\ubc88 \ud3ec\uc778\ud2b8\ub97c \uc7a1\uc544\uc8fc\uc2dc\uace0 \ub193\uce58\uace0 \uc9c0\ub098\uce5c \ubd80\ubd84 \ucc3e\uc544\uc8fc\uc2e0 \ub9ac\ub205\uc11c\ub2d8\uc5d0\uac8c \uac10\uc0ac\uc758 \uc778\uc0ac \uc62c\ub9bd\ub2c8\ub2e4.<\/p>\n\n\n<div class=\"vlp-link-container vlp-layout-basic wp-block-visual-link-preview-link\"><a href=\"https:\/\/linuxer.name\/\" class=\"vlp-link\" title=\"\ub9ac\ub205\uc11c\uc758 \uae30\uc220\uc220 \ube14\ub85c\uadf8 - \uc624\ub298\ub3c4 \uc2e0\ub098\uac8c \uac08\uc544\ub123\ub294 \uc778\uc0dd\" rel=\"nofollow\" target=\"_blank\"><\/a><div class=\"vlp-layout-zone-side\"><div class=\"vlp-block-2 vlp-link-image\"><img decoding=\"async\" src=\"https:\/\/cdn.linuxer.name\/wp-content\/uploads\/2021\/04\/07215055\/image-1.png\" style=\"max-width: 150px; max-height: 150px\" \/><\/div><\/div><div class=\"vlp-layout-zone-main\"><div class=\"vlp-block-0 vlp-link-title\">\ub9ac\ub205\uc11c\uc758 \uae30\uc220\uc220 \ube14\ub85c\uadf8 &#8211; \uc624\ub298\ub3c4 \uc2e0\ub098\uac8c \uac08\uc544\ub123\ub294 \uc778\uc0dd<\/div><div class=\"vlp-block-1 vlp-link-summary\">\ub9ac\ub205\uc11c\ub4e4\uc740 \uc774\uc0c1\ud55c \uac83\uc5d0 \uc9d1\ucc29\ud558\uace4 \ud55c\ub2e4.<\/div><\/div><\/div>\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"has-white-color has-luminous-vivid-orange-background-color has-text-color has-background wp-block-heading\">    Find hints<\/h3>\n\n\n\n<p>\uc704 \uccab\ubc88\uc9f8 \uc6d0\uc778\uc744 \ud574\uacb0\ud558\uace0\ub3c4 \uc815\uc0c1\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc774 \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<br>\uadf8\ub798\uc11c \ud604\uc7ac \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc774 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\uace0\uc788\uace0 \ud2b9\uc815 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\ub294\uac00 \ud655\uc778\ud574\ubcf4\uae30\ub85c \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"957\" height=\"310\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053005\/2-04.png\" alt=\"\" class=\"wp-image-510\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053005\/2-04.png 957w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053005\/2-04-300x97.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053005\/2-04-768x249.png 768w\" sizes=\"(max-width: 957px) 100vw, 957px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"474\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053448\/2-05-1024x474.png\" alt=\"\" class=\"wp-image-511\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053448\/2-05-1024x474.png 1024w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053448\/2-05-300x139.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053448\/2-05-768x355.png 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053448\/2-05-1536x710.png 1536w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053448\/2-05-1080x500.png 1080w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05053448\/2-05.png 1574w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><br>\uc6b0\uc120 CloudFront\uc758 Cache statistics\uc640 Monitoring\uc744 \uccb4\ud06c\ud574\ubcf4\uc558\uace0<br>\uac01 \uc624\ub958 \ucf54\ub4dc \ubc0f Header\uac12\uc744 \ud655\uc778\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"844\" height=\"750\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05054800\/2-06.png\" alt=\"\" class=\"wp-image-512\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05054800\/2-06.png 844w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05054800\/2-06-300x267.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05054800\/2-06-768x682.png 768w\" sizes=\"(max-width: 844px) 100vw, 844px\" \/><\/figure>\n\n\n\n<p>3xx\uc758 \uc815\uccb4\ub294 301, 2xx\ub294 200, 4xx\ub294 403\uc73c\ub85c \ubcf4\uc785\ub2c8\ub2e4.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"984\" height=\"731\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05055847\/2-07.png\" alt=\"\" class=\"wp-image-513\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05055847\/2-07.png 984w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05055847\/2-07-300x223.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05055847\/2-07-768x571.png 768w\" sizes=\"(max-width: 984px) 100vw, 984px\" \/><\/figure>\n\n\n\n<p>http:\/\/\uc8fc\uc18c\/\uacbd\ub85c\/tom.png?w=110&amp;h=60&amp;f=webp&amp;q=90  [Viewer Request]<br>Status Code \ub85c301 Move Permanently\ub97c \ubc1b\uc73c\uba70 \ub9ac\ub2e4\uc774\ub809\ud2b8 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. <br>X-Cache : Redirect from cloudfront<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"980\" height=\"798\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05055857\/2-08.png\" alt=\"\" class=\"wp-image-514\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05055857\/2-08.png 980w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05055857\/2-08-300x244.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/03\/05055857\/2-08-768x625.png 768w\" sizes=\"(max-width: 980px) 100vw, 980px\" \/><\/figure>\n\n\n\n<p>https\ub85c \ub9ac\ub2e4\uc774\ub809\ud2b8 \ub418\uace0 Status Code\ub85c 200\uc744 \ubc1b\uc558\uc2b5\ub2c8\ub2e4.<br>x-cache : Miss from cloudfront \uc5e3\uc9c0 \ub85c\ucf00\uc774\uc158 \uce90\uc2dc\uc5d0 tom.png?w=110&amp;h=60&amp;f=webp&amp;q=90\uac00 \uc5c6\uc5b4 Origin\uc5d0 \uc694\uccad\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c Origin\uc740 tom.png \uc774\ubbf8\uc9c0\uac00 \uc788\ub294 S3 \ubc84\ud0b7!<br>\uc774\ubbf8\uc9c0\ub3c4 \uc798 \ub370\ub824\uc654\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub7f0\ub370 \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc774 \ub418\uc9c0\uc54a\uc740 \uc0c1\ud0dc\ub85c \ub118\uc5b4\uc654\uc2b5\ub2c8\ub2e4.<br>User\uac00 Cloudfront\ub85c &#8220;Viewer request&#8221; \ud588\uace0  <strong>(1. User \u2192 Cloudfront)<\/strong><br>Miss from cloudfront\ub77c Cloudfront\uac00 Origin\uc5d0\uac8c &#8220;Origin request&#8221; \ud558\uace0 <strong>(2. Cloudfront \u2192 Origin)<\/strong><br>Origin\uc73c\ub85c\ubd80\ud130 &#8220;Origin reponse&#8221; \ud6c4 <strong>(3. Origin \u2192 Cloudfront)<\/strong><br>Cloudfront\uac00 \ub2e4\uc2dc User\uc5d0\uac8c &#8220;Viewer response&#8221; <strong>(4. Cloudfront \u2192 User)<\/strong> \ub418\uc5b4 <br>\uc774\ubbf8\uc9c0\ub97c \ubc1b\uc558\ub2e4\ub77c\uace0 \ud588\uc744 \ub54c [1], [2], [4] \uacfc\uc815\uc740 \ubb38\uc81c\uac00 \uc5c6\uc5c8\uc744 \uac83\uc774\ub77c \uc0dd\uac01\ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<p>[1],[4] \uc694\uccad\uacfc \uc751\ub2f5\uc5d0 \ub300\ud55c \ud1b5\uc2e0\uc740 \uc815\uc0c1\uc801\uc73c\ub85c \ub418\uc5c8\uc73c\uba70 Miss from cloudfront \uc751\ub2f5\uc5d0 <br>[2] CloudFront\ub294 Origin\uc5d0\uac8c \uc694\uccad\uc744 \ud588\uc744 \uac83\uc785\ub2c8\ub2e4.<br><br>\uadf8\ub807\ub2e4\uba74 [3] \uacfc\uc815\uc5d0\uc11c  \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud558\uc9c0 \uc54a\ub294 \uac83\uc774 \uc788\ub2e4\ub294 \uac83\uc778\ub370?<\/p>\n\n\n\n<p>Cloudfront \uc124\uc815\uc740 \uba87\ubc88\uc744 \ubc18\ubcf5\ud558\uc5ec \ubcf4\uc544\ub3c4 \ub354 \uc774\uc0c1 \uc798\ubabb \uc124\uc815\ud55c \uac83\uc774 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<br>\uadf8\ub798\uc11c Lambda \uc124\uc815\uc744 \uc870\uae08 \ub354 \uac80\ud1a0\ud574\ubcf4\uae30\ub85c \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"has-white-color has-luminous-vivid-amber-background-color has-text-color has-background wp-block-heading\">    Second Cause<\/h3>\n\n\n\n<p>\uc6d0\uc778\uc744 \uc804\ud600 \ubabb\ucc3e\ub2e4\uac00 \uc0ac\ub0b4 \uc0c1\uc0ac\uc758 \ub3c4\uc6c0\uc73c\ub85c &#8220;Node.js \ubc84\uc804\uc5d0 \ub9de\ub294 \uc18c\uc2a4 \ucf54\ub4dc\ub97c \uc0ac\uc6a9\ud588\ub294\uac00? \uc18c\uc2a4 \ucf54\ub4dc\uac00 \ubc84\uc804\uc5d0 \ub9de\uc9c0\uc54a\uc544\uc11c \uadf8\ub7f4 \uc218 \uc788\ub2e4&#8221;\ub77c\ub294 \ud78c\ud2b8\ub97c \uc5bb\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub7f0\ub370 \uc544\ubb34\ub9ac \uc0dd\uac01\ud574\ubd10\ub3c4 \ub2e4\ub978 \uc124\uc815\uc740 \uc798 \ub418\uc5b4\uc788\uace0 \uc815\ub9d0 \uc18c\uc2a4 \ucf54\ub4dc\ucabd\uc774 \ud06c\uac8c \uc758\uc2ec\ub418\uc5b4 \ubc14\ub85c \ubc84\uc804\uacfc \uc18c\uc2a4 \ucf54\ub4dc \ubcc0\uacbd\uc744 \uc9c4\ud589\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>Node.js \ubc84\uc804\uc740 12.x \ubc84\uc804\uc73c\ub85c \ubcc0\uacbd\ud558\uc600\uace0 \uc18c\uc2a4 \ucf54\ub4dc\ub294 \uc544\ub798\uc640 \uac19\uc774 \uc218\uc815\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">'use strict';\n\nconst querystring = require('querystring'); \/\/ Don't install.\nconst AWS = require('aws-sdk'); \/\/ Don't install.\nconst Sharp = require('sharp');\n\nconst S3 = new AWS.S3({\n  region: 'ap-northeast-2'\n});\nconst BUCKET = 'mybucket';\n\nexports.handler = async (event, context, callback) => {\n  const { request, response } = event.Records[0].cf;\n  \/\/ Parameters are w, h, f, q and indicate width, height, format and quality.\n  const params = querystring.parse(request.querystring);\n\n  \/\/ Required width or height value.\n  if (!params.w &amp;&amp; !params.h) {\n    return callback(null, response);\n  }\n\n  \/\/ Extract name and format.\n  const { uri } = request;\n  const [, imageName, extension] = uri.match(\/\\\/?(.*)\\.(.*)\/);\n\n  \/\/ Init variables\n  let width;\n  let height;\n  let format;\n  let quality; \/\/ Sharp\ub294 \uc774\ubbf8\uc9c0 \ud3ec\ub9f7\uc5d0 \ub530\ub77c\uc11c \ud488\uc9c8(quality)\uc758 \uae30\ubcf8\uac12\uc774 \ub2e4\ub985\ub2c8\ub2e4.\n  let s3Object;\n  let resizedImage;\n\n  \/\/ Init sizes.\n  width = parseInt(params.w, 10) ? parseInt(params.w, 10) : null;\n  height = parseInt(params.h, 10) ? parseInt(params.h, 10) : null;\n\n  \/\/ Init quality.\n  if (parseInt(params.q, 10)) {\n    quality = parseInt(params.q, 10);\n  }\n\n  \/\/ Init format.\n  format = params.f ? params.f : extension;\n  format = format === 'jpg' ? 'jpeg' : format;\n\n  \/\/ For AWS CloudWatch.\n  console.log(`parmas: ${JSON.stringify(params)}`); \/\/ Cannot convert object to primitive value.\n  console.log(`name: ${imageName}.${extension}`); \/\/ Favicon error, if name is `favicon.ico`.\n\n  try {\n    s3Object = await S3.getObject({\n      Bucket: BUCKET,\n      Key: decodeURI(imageName + '.' + extension)\n    }).promise();\n  } catch (error) {\n    console.log('S3.getObject: ', error);\n    return callback(error);\n  }\n\n  try {\n    resizedImage = await Sharp(s3Object.Body)\n      .resize(width, height)\n      .toFormat(format, {\n        quality\n      })\n      .toBuffer();\n  } catch (error) {\n    console.log('Sharp: ', error);\n    return callback(error);\n  }\n\n  const resizedImageByteLength = Buffer.byteLength(resizedImage, 'base64');\n  console.log('byteLength: ', resizedImageByteLength);\n\n  \/\/ `response.body`\uac00 \ubcc0\uacbd\ub41c \uacbd\uc6b0 1MB\uae4c\uc9c0\ub9cc \ud5c8\uc6a9\ub429\ub2c8\ub2e4.\n  if (resizedImageByteLength >= 1 * 1024 * 1024) {\n    return callback(null, response);\n  }\n\n  response.status = 200;\n  response.body = resizedImage.toString('base64');\n  response.bodyEncoding = 'base64';\n  response.headers['content-type'] = [\n    {\n      key: 'Content-Type',\n      value: `image\/${format}`\n    }\n  ];\n  return callback(null, response);\n};<\/pre>\n\n\n\n<p>\uac1c\ubc1c\ucabd\uc740 \uc544\uc9c1 \ubbf8\uc219\ud558\uc5ec \uc18c\uc2a4 \ucf54\ub4dc\ub294 \uc544\ub798 \ub9c1\ud06c\ub97c \ucc38\uace0\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<div class=\"vlp-link-container vlp-layout-basic wp-block-visual-link-preview-link\"><a href=\"https:\/\/velog.io\/@dankim\/Lambdaedge-cloudFront-S3\" class=\"vlp-link\" title=\"Lambda@edge + cloudFront + S3\" rel=\"nofollow\" target=\"_blank\"><\/a><div class=\"vlp-layout-zone-side\"><div class=\"vlp-block-2 vlp-link-image\"><img decoding=\"async\" src=\"https:\/\/images.velog.io\/images\/dankim\/post\/fddeb518-6b6f-4851-b3b0-f36997e2a073\/image.png\" style=\"max-width: 150px; max-height: 150px\" \/><\/div><\/div><div class=\"vlp-layout-zone-main\"><div class=\"vlp-block-0 vlp-link-title\">Lambda@edge + cloudFront + S3<\/div><div class=\"vlp-block-1 vlp-link-summary\">\uc21c\uc11c\ub300\ub85c \ud574\ubd05\uc2dc\ub2e4. 1) IAM \uc815\ucc45 \ubc0f \uc5ed\ud560 \uc0dd\uc131 1. IAM \uc815\ucc45 \uc0dd\uc131 \uc815\ucc45 \uc120\ud0dd \uc815\ucc45 \uc0dd\uc131 \uc120\ud0dd JSON \uc120\ud0dd \ubc0f \uc544\ub798 \uc815\ucc45 \uc785\ub825 \uc815\ucc45 \uac80\ud1a0 \uc120\ud0dd \uc815\ucc45 \uc774\ub984 ResizingImagePolicy \ub610\ub294 \uc6d0\ud558\ub294 \uc774\ub984 \uc120\ud0dd (\uc124\uba85 \uc635\uc158) \uc815\ucc45<\/div><\/div><\/div>\n\n\n<p>\uc18c\uc2a4 \ucf54\ub4dc \ubcc0\ud658 \ud6c4 lambda \uc7ac\ubc30\ud3ec\ud558\uc5ec \ub2e4\uc2dc \ud55c \ubc88 \ub9ac\uc0ac\uc774\uc9d5 \ud14c\uc2a4\ud2b8\ub97c \ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"has-white-color has-vivid-green-cyan-background-color has-text-color has-background wp-block-heading\"> Success<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"556\" src=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/06\/06133346\/resizing-1024x556.png\" alt=\"\" class=\"wp-image-947\" srcset=\"https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/06\/06133346\/resizing-1024x556.png 1024w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/06\/06133346\/resizing-300x163.png 300w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/06\/06133346\/resizing-768x417.png 768w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/06\/06133346\/resizing-1536x835.png 1536w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/06\/06133346\/resizing-1080x587.png 1080w, https:\/\/cdn.manvscloud.com\/wp-content\/uploads\/2021\/06\/06133346\/resizing.png 1912w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>\uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc644\ub8cc\ub418\uc5c8\uc2b5\ub2c8\ub2e4!<br>Node.js \ubc84\uc804\uacfc \uc18c\uc2a4 \ucf54\ub4dc \ubcc0\uacbd \ud6c4 \uc815\uc0c1\uc801\uc73c\ub85c \ub9ac\uc0ac\uc774\uc9d5\uc774 \ub418\ub124\uc694<\/p>\n\n\n\n<p>\uc774\ubc88 \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc744 \uacc4\uae30\ub85c \uac1c\ubc1c\ucabd \uacf5\ubd80\ub3c4 \ud574\uc57c\uaca0\ub2e4\ub294 \uc0dd\uac01\uc774 \ub4dc\ub294\ub370 \ubc14\uc05c \uc77c\uc815\uc73c\ub85c \uc62c\ud574\ub294 \ubb34\ub9ac\uc785\ub2c8\ub2e4&#8230;<\/p>\n\n\n\n<p>\uadf8\ub798\ub3c4 \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5 \uc131\uacf5\ud560 \uc218 \uc788\uc5b4\uc11c \ubfcc\ub4ef\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uae34 \uae00 \uc77d\uc5b4\uc8fc\uc154\uc11c \uac10\uc0ac\ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc548\ub155\ud558\uc138\uc694. ManVSCloud \uae40\uc218\ud604\uc785\ub2c8\ub2e4. \uc624\ub298\uc740 \uc774\uc804\uc5d0 \uc2e4\ud328\ud588\ub358 image resizing \uc2e4\ud328 \uc6d0\uc778\uc744 \ud655\uc778 \ud6c4 \uc815\uc0c1\uc801\uc73c\ub85c resizing \uc131\uacf5 \ud6c4\uae30\ub97c \ub0a8\uaca8\ubcf4\ub824\uace0 \ud569\ub2c8\ub2e4. First Cause \uccab\ubc88\uc9f8 \uc6d0\uc778\uc744 \ucc3e\uc558\uc2b5\ub2c8\ub2e4.CloudFront \ud2b8\ub9ac\uac70 \uad6c\uc131 \uc2dc Origin Response\uac00 \ub418\uc5b4\uc57c\ud558\ub294\ub370 Request\ub85c \uc124\uc815\uc744 \ud574\ub450\uc5c8\ub358 \uac83! Lambda\uc5d0\uc11c \ubcc0\uacbd \uc2dc \uc704\uc5d0\uc11c \uc624\ub9ac\uc9c4 \uc751\ub2f5\uc73c\ub85c \ubcc0\uacbd\ud558\uba74 \ub429\ub2c8\ub2e4. \ub9cc\uc57d Cloudfront\uc5d0\uc11c \ubcc0\uacbd\uc744 \ud558\uc2e4 \uacbd\uc6b0 \uc5f0\uacb0\ub41c cloudfront\uc5d0\uc11c [Behaviors]-[\uacbd\ub85c \uc120\ud0dd \ubc0f Edit] \ud6c4 \uc544\ub798 CloudFront Event\uc5d0\uc11c Origin Response\ub85c \ubcc0\uacbd\ud574\uc904 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubd80\ubd84\uc740 \ub9ac\ub205\uc11c\ub2d8\uc758 \ub3c4\uc6c0\uc744 \ubc1b\uc558\uc2b5\ub2c8\ub2e4.\ud574\ub2f9 \ubd80\ubd84\uc774 Response\uac00 \ub418\uc5b4\uc57c\ud558\ub294 \uc774\uc720\ub294 \uc778\uc9c0\ud558\uace0 \uc788\uc5c8\ub294\ub370 \ub2e4\uc2dc \ud55c\ubc88 \ud3ec\uc778\ud2b8\ub97c \uc7a1\uc544\uc8fc\uc2dc\uace0 \ub193\uce58\uace0 \uc9c0\ub098\uce5c \ubd80\ubd84 \ucc3e\uc544\uc8fc\uc2e0 \ub9ac\ub205\uc11c\ub2d8\uc5d0\uac8c \uac10\uc0ac\uc758 \uc778\uc0ac \uc62c\ub9bd\ub2c8\ub2e4. Find hints \uc704 \uccab\ubc88\uc9f8 \uc6d0\uc778\uc744 \ud574\uacb0\ud558\uace0\ub3c4 \uc815\uc0c1\uc801\uc73c\ub85c \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc774 \ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\uadf8\ub798\uc11c \ud604\uc7ac \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc774 \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\uace0\uc788\uace0 \ud2b9\uc815 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\ub294\uac00 \ud655\uc778\ud574\ubcf4\uae30\ub85c \ud588\uc2b5\ub2c8\ub2e4. \uc6b0\uc120 CloudFront\uc758 Cache statistics\uc640 Monitoring\uc744 \uccb4\ud06c\ud574\ubcf4\uc558\uace0\uac01 \uc624\ub958 \ucf54\ub4dc \ubc0f Header\uac12\uc744 \ud655\uc778\ud574\ubcf4\uc558\uc2b5\ub2c8\ub2e4. 3xx\uc758 \uc815\uccb4\ub294 301, 2xx\ub294 200, 4xx\ub294 403\uc73c\ub85c \ubcf4\uc785\ub2c8\ub2e4. http:\/\/\uc8fc\uc18c\/\uacbd\ub85c\/tom.png?w=110&amp;h=60&amp;f=webp&amp;q=90 [Viewer Request]Status Code \ub85c301 Move Permanently\ub97c \ubc1b\uc73c\uba70 \ub9ac\ub2e4\uc774\ub809\ud2b8 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. X-Cache : Redirect from cloudfront https\ub85c \ub9ac\ub2e4\uc774\ub809\ud2b8 \ub418\uace0 Status Code\ub85c 200\uc744 \ubc1b\uc558\uc2b5\ub2c8\ub2e4.x-cache : Miss from cloudfront \uc5e3\uc9c0 \ub85c\ucf00\uc774\uc158 \uce90\uc2dc\uc5d0 tom.png?w=110&amp;h=60&amp;f=webp&amp;q=90\uac00 \uc5c6\uc5b4 Origin\uc5d0 \uc694\uccad\ud569\ub2c8\ub2e4. \uc5ec\uae30\uc11c Origin\uc740 tom.png \uc774\ubbf8\uc9c0\uac00 \uc788\ub294 S3 \ubc84\ud0b7!\uc774\ubbf8\uc9c0\ub3c4 \uc798 \ub370\ub824\uc654\uc2b5\ub2c8\ub2e4. \uadf8\ub7f0\ub370 \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5\uc774 \ub418\uc9c0\uc54a\uc740 \uc0c1\ud0dc\ub85c \ub118\uc5b4\uc654\uc2b5\ub2c8\ub2e4.User\uac00 Cloudfront\ub85c &#8220;Viewer request&#8221; \ud588\uace0 (1. User \u2192 Cloudfront)Miss from cloudfront\ub77c Cloudfront\uac00 Origin\uc5d0\uac8c &#8220;Origin request&#8221; \ud558\uace0 (2. Cloudfront \u2192 Origin)Origin\uc73c\ub85c\ubd80\ud130 &#8220;Origin reponse&#8221; \ud6c4 (3. Origin \u2192 Cloudfront)Cloudfront\uac00 \ub2e4\uc2dc User\uc5d0\uac8c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"AWS Lambda\ub97c \uc774\uc6a9\ud55c \uc774\ubbf8\uc9c0 \ub9ac\uc0ac\uc774\uc9d5 \uc2e4\ud328 \ud6c4 \ud2b8\ub7ec\ube14\uc288\ud305","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[6,149,136,147,145,143,144,32,317,318,148,319,146,316],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/506"}],"collection":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=506"}],"version-history":[{"count":3,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/506\/revisions"}],"predecessor-version":[{"id":949,"href":"https:\/\/manvscloud.com\/index.php?rest_route=\/wp\/v2\/posts\/506\/revisions\/949"}],"wp:attachment":[{"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=506"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=506"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manvscloud.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=506"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}