{"id":28412,"date":"2018-12-24T14:45:29","date_gmt":"2018-12-24T05:45:29","guid":{"rendered":"https:\/\/jirak.net\/wp\/aws-lambda-%ed%95%a8%ec%88%98%eb%a1%9c-net-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98-%ea%b0%9c%eb%b0%9c%ed%95%98%ea%b8%b0\/"},"modified":"2018-12-24T15:34:34","modified_gmt":"2018-12-24T06:34:34","slug":"aws-lambda-%ed%95%a8%ec%88%98%eb%a1%9c-net-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98-%ea%b0%9c%eb%b0%9c%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/jirak.net\/wp\/aws-lambda-%ed%95%a8%ec%88%98%eb%a1%9c-net-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98-%ea%b0%9c%eb%b0%9c%ed%95%98%ea%b8%b0\/","title":{"rendered":"AWS Lambda \ud568\uc218\ub85c .NET \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\ud558\uae30"},"content":{"rendered":"<p>AWS Lambda \ud568\uc218\ub85c .NET \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\ud558\uae30<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/jirak.net\/wp\/wp-content\/uploads\/2018\/12\/local-api-test.png\" width=\"899\" height=\"412\"><\/p>\n<p>AWS Lambda \ud568\uc218\uac00 \uc81c\uacf5\ud558\ub294 \uac00\uc7a5 \ud070 \uc774\uc810 \uc911 \ud558\ub098\ub294 \uac1c\ubc1c \uc791\uc5c5\uc744 \uae30\ubc18 \uc778\ud504\ub77c\uc640 \uaca9\ub9ac\ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uaca9\ub9ac\ub294 \ucf54\ub4dc \ubc30\ud3ec\uc640 \uad00\ub9ac\ub97c \uc6a9\uc774\ud558\uac8c \ud558\uc9c0\ub9cc, \ud14c\uc2a4\ud2b8\uc640 \ub514\ubc84\uae45 \ubc0f \ubb38\uc81c \uc9c4\ub2e8\uc744 \uc704\ud55c \uc811\uadfc \ubc29\uc2dd\uc744 \ubd84\uba85\ud788 \uc815\uc758\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \uc9c0\uc6d0\ud558\ub294 \ubc29\ubc95\uc73c\ub85c AWS \uc11c\ube44\uc2a4\ub97c \ud65c\uc6a9\ud55c \ub2e4\uc591\ud55c \ubaa8\ubc94 \uc0ac\ub840\uac00 \uc788\uc9c0\ub9cc .NET \uae30\ubc18\uc73c\ub85c Lambda \ud568\uc218\ub97c \uac1c\ubc1c\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \uc544\ub798 \ub124 \uac00\uc9c0 \ubc29\ubc95\uc744 \ub530\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ub3c5\ub9bd\ub41c \uae30\ub2a5 \uc218\uc900\uc758 \ud14c\uc2a4\ud2b8\uc640 \ub514\ubc84\uae45\uc744 \uc704\ud55c \ub2e8\uc704 \ud14c\uc2a4\ud2b8 \uc218\ud589<\/li>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/test-sam-cli.html\" target=\"_blank\" rel=\"noopener\">AWS Serverless Application Model CLI<\/a>(AWS SAM)\ub97c \uc0ac\uc6a9\ud55c \ub85c\uceec \ud1b5\ud569 \ud14c\uc2a4\ud2b8<\/li>\n<li><a href=\"https:\/\/aws.amazon.com\/cloudwatch\/\" target=\"_blank\" rel=\"noopener\">Amazon CloudWatch<\/a> \ub85c\uae45\uc744 \uc0ac\uc6a9\ud55c \uc774\ubca4\ud2b8 \ubc0f \uc624\ub958 \uae30\ub85d<\/li>\n<li><a href=\"https:\/\/aws.amazon.com\/xray\/\" target=\"_blank\" rel=\"noopener\">AWS X-Ray<\/a>\uc758 \ub808\ucf54\ub529\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4 \uc804\uccb4\uc5d0 \uac78\uce5c \uc2e4\ud589 \ucd94\uc801<\/li>\n<\/ul>\n<p>\uc774 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \ud604\uc7ac\uc758 UTC \uc2dc\uac04\uc744 \ubc18\ud658\ud558\ub294 \ub2e8\uc21c\ud55c Lambda \ud568\uc218\ub97c Amazon API Gateway \uae30\ubc18\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc9c4 \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0\uc11c \ud638\ucd9c\ud558\ub294 \ub370\ubaa8\ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ub370\ubaa8\ub97c \uae30\uc900\uc73c\ub85c \uc190\uc26c\uc6b4 \ub514\ubc84\uae45, \ub85c\uae45 \ubc0f \ucd94\uc801\uc744 \uc704\ud55c \ucf54\ub4dc\ub97c \uc124\uacc4\ud558\ub294 \ubc29\ubc95\uc744 \uc18c\uac1c \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc804\uc5d0 .NET Core \uae30\ubc18\uc758 Lambda \ud568\uc218\ub97c \uc0dd\uc131\ud55c \uc801\uc774 \uc5c6\ub2e4\uba74 \ub2e4\uc74c \uac8c\uc2dc\ubb3c\uc5d0\uc11c \uc2dc\uc791\ud558\ub294 \ub370 \uc720\uc6a9\ud55c \uc815\ubcf4\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><a href=\"https:\/\/aws.amazon.com\/blogs\/developer\/aws-lambda-net-core-2-0-support-released\/\" target=\"_blank\" rel=\"noopener\">AWS Lambda .NET Core 2.0 \uc9c0\uc6d0 \ucd9c\uc2dc<\/a><\/li>\n<li><a href=\"https:\/\/aws.amazon.com\/blogs\/developer\/using-the-aws-lambda-project-in-visual-studio\/\" target=\"_blank\" rel=\"noopener\">Visual Studio\uc5d0\uc11c AWS Lambda \ud504\ub85c\uc81d\ud2b8 \uc0ac\uc6a9<\/a><\/li>\n<li><a href=\"https:\/\/aws.amazon.com\/blogs\/developer\/aws-serverless-applications-in-visual-studio\/\" target=\"_blank\" rel=\"noopener\">Visual Studio\uc758 AWS Serverless Application<\/a><\/li>\n<\/ul>\n<h3>Lambda \uae30\ub2a5 \ub2e8\uc704 \ud14c\uc2a4\ud2b8<\/h3>\n<p>.NET Core Lambda \ud568\uc218\ub97c \uc0dd\uc131\ud558\ub294 \uac00\uc7a5 \uc26c\uc6b4 \ubc29\ubc95 \uc911 \ud558\ub098\ub294 .NET Core CLI\ub97c \uc0ac\uc6a9\ud558\uace0 Lambda Empty Serverless \ud15c\ud50c\ub9bf\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc194\ub8e8\uc158\uc744 \uc0dd\uc131\ud558\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>Lambda \ud15c\ud50c\ub9bf\uc744 \uc124\uce58\ud558\uc9c0 \uc54a\uc558\ub2e4\uba74 \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc138\uc694.<\/p>\n<pre><code>dotnet new -i Amazon.Lambda.Templates::*<\/code><\/pre>\n<p>\uc774\uc81c \ud15c\ud50c\ub9bf\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc11c\ubc84\ub9ac\uc2a4 \ud504\ub85c\uc81d\ud2b8 \ubc0f \ub2e8\uc704 \ud14c\uc2a4\ud2b8 \ud504\ub85c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud55c \ud6c4, \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc5ec .NET Core \uc194\ub8e8\uc158\uc5d0 \ud504\ub85c\uc81d\ud2b8\ub97c \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>dotnet new serverless.EmptyServerless -n DebuggingExample\ncd DebuggingExample\ndotnet new sln -n DebuggingExample\ndotnet sln DebuggingExample.sln add *\/*\/*.csproj<\/code><\/pre>\n<p>\uc544\uc9c1\uc740 \ucd94\uac00\ub41c \ucf54\ub4dc\uac00 \uc5c6\uc9c0\ub9cc \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\uc5ec \ubaa8\ub4e0 \ud56d\ubaa9\uc774 \uc815\uc0c1 \ub3d9\uc791\ud558\ub294\uc9c0 \uac80\uc99d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>cd test\/DebuggingExample.Tests\/\ndotnet test<\/code><\/pre>\n<p>\ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \ud6a8\uacfc\uc801\uc73c\ub85c \uc218\ud589\ud558\uae30 \uc704\ud55c \uc8fc\uc694 \uc6d0\uce59 \uc911 \ud558\ub098\ub294 \ud14c\uc2a4\ud2b8 \ud558\ub824\ub294 \uae30\ub2a5\uc744 \uaca9\ub9ac\ud55c \uc0c1\ud0dc\uc5d0\uc11c \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. Lambda \ud568\uc218\uc758 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uacfc \uc2e4\uc81c Lambda \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \ucf54\ub4dc\ub97c \ubd84\ub9ac\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc790\uc8fc \uc0ac\uc6a9\ud558\ub294 \ud3b8\uc9d1\uae30\ub97c \uc0ac\uc6a9\ud558\uc5ec <em>ITimeProcessor.cs<\/em>\ub77c\ub294 \uc0c8 \ud30c\uc77c\uc744 <em>src\/DebuggingExample<\/em> \ud3f4\ub354\uc5d0 \uc0dd\uc131\ud558\uace0, \ub2e4\uc74c\uacfc \uac19\uc740 \uae30\ubcf8 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">using System;\n\nnamespace DebuggingExample\n{\n    public interface ITimeProcessor\n    {\n        DateTime CurrentTimeUTC();\n    }\n}<\/code><\/pre>\n<p>\uadf8\ub7f0 \ub2e4\uc74c <em>TimeProcessor.cs<\/em> \ud30c\uc77c\uc744 <em>src\/DebuggingExample<\/em> \ud3f4\ub354\uc5d0 \uc0c8\ub85c \ub9cc\ub4ed\ub2c8\ub2e4. \uc774 \ud30c\uc77c\uc5d0\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \uad6c\uccb4\uc801\uc778 \ud074\ub798\uc2a4\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">using System;\n\nnamespace DebuggingExample\n{\n    public class TimeProcessor : ITimeProcessor\n    {\n        public DateTime CurrentTimeUTC()\n        {\n            return DateTime.UtcNow;\n        }\n    }\n} <\/code><\/pre>\n<p>\uc774\uc81c <em>TimeProcessorTest.cs<\/em> \ud30c\uc77c\uc744 <em>src\/DebuggingExample.Tests<\/em> \ud3f4\ub354\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \ud30c\uc77c\uc5d0\ub294 \ub2e4\uc74c \ucf54\ub4dc\uac00 \ud3ec\ud568\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">using System;\nusing Xunit;\n\nnamespace DebuggingExample.Tests\n{\n    public class TimeProcessorTest\n    {\n        [Fact]\n        public void TestCurrentTimeUTC()\n        {\n            \/\/ Arrange\n            var processor = new TimeProcessor();\n            var preTestTimeUtc = DateTime.UtcNow;\n\n            \/\/ Act\n            var result = processor.CurrentTimeUTC();\n\n            \/\/ Assert time moves forwards \n            var postTestTimeUtc = DateTime.UtcNow;\n            Assert.True(result &gt;= preTestTimeUtc);\n            Assert.True(result &lt;= postTestTimeUtc);\n        }\n    }\n}<\/code><\/pre>\n<p>\uc774\uc81c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud560 \uc900\ube44\ub97c \ub9c8\ucce4\uc2b5\ub2c8\ub2e4. <em>test\/DebuggingExample.Tests<\/em> \ud3f4\ub354\uc5d0\uc11c \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>dotnet test<\/code><\/pre>\n<h3>Lambda \ud568\uc218\ub85c \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1 \ud45c\ud604<\/h3>\n<p>\ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc4f0\uace0 \ud14c\uc2a4\ud2b8\ud588\uc73c\ub2c8 \uc774\uc81c Lambda \ud568\uc218\ub85c \ub098\ud0c0\ub0bc \uc218 \uc788\uc2b5\ub2c8\ub2e4. <em>src\/DebuggingExample\/Function.cs<\/em> \ud30c\uc77c\uc744 \ud3b8\uc9d1\ud558\uc5ec <em>CurrentTimeUTC<\/em> \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">using System;\nusing System.Collections.Generic;\nusing System.Net;\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.APIGatewayEvents;\nusing Newtonsoft.Json;\n\n\/\/ Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.\n[assembly: LambdaSerializer(\ntypeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] \n\nnamespace DebuggingExample\n{\n    public class Functions\n    {\n        ITimeProcessor processor = new TimeProcessor();\n\n        public APIGatewayProxyResponse Get(\nAPIGatewayProxyRequest request, ILambdaContext context)\n        {\n            var result = processor.CurrentTimeUTC();\n\n            return CreateResponse(result);\n        }\n\nAPIGatewayProxyResponse CreateResponse(DateTime? result)\n{\n    int statusCode = (result != null) ? \n        (int)HttpStatusCode.OK : \n        (int)HttpStatusCode.InternalServerError;\n\n    string body = (result != null) ? \n        JsonConvert.SerializeObject(result) : string.Empty;\n\n    var response = new APIGatewayProxyResponse\n    {\n        StatusCode = statusCode,\n        Body = body,\n        Headers = new Dictionary&lt;string, string&gt;\n        { \n            { &quot;Content-Type&quot;, &quot;application\/json&quot; }, \n            { &quot;Access-Control-Allow-Origin&quot;, &quot;*&quot; } \n        }\n    };\n    \n    return response;\n}\n    }\n}<\/code><\/pre>\n<p><em>TimeProcessor<\/em> \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\uac00 \uc778\uc2a4\ud134\uc2a4\ud654\ub41c \ub2e4\uc74c Lambda \ud568\uc218\uc758 \uc9c4\uc785\uc810\uc73c\ub85c \uc0ac\uc6a9\ud560 <em>Get()<\/em> \uba54\uc11c\ub4dc\uac00 \uc815\uc758\ub429\ub2c8\ub2e4.<\/p>\n<p>\uae30\ubcf8\uc801\uc73c\ub85c .NET Core Lambda \ud568\uc218 \ud578\ub4e4\ub7ec\ub294 <em>Stream<\/em>\uc5d0\uc11c \uc785\ub825\uc744 \ucc3e\uc2b5\ub2c8\ub2e4. \uc774 \uae30\ubcf8 \ub3d9\uc791\uc744 \uc7ac\uc815\uc758\ud558\ub824\uba74 serializer\ub97c \uc120\uc5b8\ud558\uace0 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc694\uccad \ubc0f \uc751\ub2f5 \uc720\ud615\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud578\ub4e4\ub7ec\uc758 \uba54\uc11c\ub4dc \uc11c\uba85\uc744 \uc815\uc758\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud504\ub85c\uc81d\ud2b8\ub294 <em>serverless.EmptyServerless<\/em> \ud15c\ud50c\ub9bf\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc0dd\uc131\ub418\uc5c8\uae30 \ub54c\ubb38\uc5d0 \uc774\ubbf8 \uae30\ubcf8 \ub3d9\uc791\uc744 \uc7ac\uc815\uc758(override)\ud569\ub2c8\ub2e4. \uae30\ubcf8 \ub3d9\uc791\uc5d0 \ub300\ud55c \uc7ac\uc815\uc758\ub294 <em>Amazon.Lambda.APIGatewayEvents<\/em>\ub97c \ucc38\uc870\ud55c \ub2e4\uc74c, \uc0ac\uc6a9\uc790 \uc9c0\uc815 serializer\ub97c \uc120\uc5b8\ud558\ub294 \ubc29\uc2dd\uc73c\ub85c \uc218\ud589\ub429\ub2c8\ub2e4. .NET\uc5d0\uc11c \uc0ac\uc6a9\uc790 \uc9c0\uc815 serializer \uc0ac\uc6a9\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 GitHub\uc758 <a href=\"https:\/\/github.com\/aws\/aws-lambda-dotnet\" target=\"_blank\" rel=\"noopener\">AWS Lambda for .NET Core<\/a> \ub9ac\ud3ec\uc9c0\ud1a0\ub9ac\ub97c \ucc38\uc870\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n<p><em>Get()<\/em>\uc740 \uba87 \uac00\uc9c0 \ud30c\ub77c\ubbf8\ud130\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li><em>APIGatewayProxyRequest<\/em> \ud30c\ub77c\ubbf8\ud130\uc5d0\ub294 Lambda \ud568\uc218\ub97c \ud638\ucd9c\ud558\ub294 API \uac8c\uc774\ud2b8\uc6e8\uc774\uc758 \uc694\uccad\uc774 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/li>\n<li>\uc120\ud0dd\uc801\uc778 <em>ILambdaContext<\/em> \ud30c\ub77c\ubbf8\ud130\uc5d0\ub294 \uc2e4\ud589 \ucee8\ud14d\uc2a4\ud2b8\uc758 \uc138\ubd80 \uc815\ubcf4\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><em>Get()<\/em> \uba54\uc11c\ub4dc\ub294 <em>CurrentTimeUTC()<\/em>\ub97c \ud638\ucd9c\ud558\uc5ec \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc5d0 \ub530\ub77c \uc2dc\uac04\uc744 \uac80\uc0c9\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c <em>CurrentTimeUTC()<\/em>\uc758 \uacb0\uacfc\uac00 <em>CreateResponse()<\/em> \uba54\uc11c\ub4dc\ub85c \uc804\ub2ec\ub418\uace0, \uc774 \uba54\uc11c\ub4dc\ub294 \uacb0\uacfc\ub97c <em>APIGatewayResponse<\/em> \uac1d\uccb4\ub85c \ubcc0\ud658\ud558\uc5ec \ud638\ucd9c\uc790\uc5d0\uac8c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc5c5\ub370\uc774\ud2b8\ub41c Lambda \ud568\uc218\ub294 \ub354 \uc774\uc0c1 \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \ud1b5\uacfc\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c <em>test\/DebuggingExample.Tests\/FunctionTest.cs<\/em> \ud30c\uc77c\uc5d0\uc11c <em>TestGetMethod<\/em>\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4. \ub2e4\uc74c \ud589\uc744 \uc81c\uac70\ud558\uc5ec \ud14c\uc2a4\ud2b8\ub97c \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">Assert.Equal(&quot;Hello AWS Serverless&quot;, response.Body);<\/code><\/pre>\n<p>\uc5c5\ub370\uc774\ud2b8 \ud6c4\uc758 <em>FunctionTest.cs<\/em> \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Xunit;\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.TestUtilities;\nusing Amazon.Lambda.APIGatewayEvents;\nusing DebuggingExample;\n\nnamespace DebuggingExample.Tests\n{\n    public class FunctionTest\n    {\n        public FunctionTest()\n        {\n        }\n\n        [Fact]\n        public void TetGetMethod()\n        {\n            TestLambdaContext context;\n            APIGatewayProxyRequest request;\n            APIGatewayProxyResponse response;\n\n            Functions functions = new Functions();\n\n            request = new APIGatewayProxyRequest();\n            context = new TestLambdaContext();\n            response = functions.Get(request, context);\n            Assert.Equal(200, response.StatusCode);\n        }\n    }\n}<\/code><\/pre>\n<p>\uc5c5\ub370\uc774\ud2b8 \uc774\ud6c4\uc758 \uc815\uc0c1 \ub3d9\uc791 \uc5ec\ubd80\ub97c \ud655\uc778\ud558\ub824\uba74 <em>test\/DebuggingExample.Tests<\/em> \ud3f4\ub354\uc5d0\uc11c \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>dotnet test<\/code><\/pre>\n<h3>AWS SAM CLI\ub97c \uc0ac\uc6a9\ud55c \ub85c\uceec \ud1b5\ud569 \ud14c\uc2a4\ud2b8<\/h3>\n<p>\ubd80\ubd84 \uae30\ub2a5 \uc218\uc900\uc5d0\uc11c\ub294 \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \uc218\ud589\ud558\ub294 \uac83\uc774 \uc801\uc808\ud55c \uc811\uadfc \ubc29\uc2dd\uc785\ub2c8\ub2e4. \uadf8\ub7ec\ub098 API \uac8c\uc774\ud2b8\uc6e8\uc774\uc640 Lambda \ud568\uc218\uac00 \uc11c\ub85c \uc5f0\ub3d9\ub418\ub294\uc9c0 \ud14c\uc2a4\ud2b8\ud558\ub824\uba74 <a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/sam-cli-requirements.html\" target=\"_blank\" rel=\"noopener\">AWS Lambda Developer Guide<\/a>\uc5d0 \uc124\uba85\ub41c \ub300\ub85c AWS SAM CLI\ub97c \uc124\uce58\ud558\uc5ec \ub85c\uceec\uc5d0\uc11c \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub7f0\ud0c0\uc784 \ud658\uacbd\uc73c\ub85c\ubd80\ud130 \uae30\ub2a5\uc744 \uaca9\ub9ac\ud558\uc5ec \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub294 \ub2e8\uc704 \ud14c\uc2a4\ud2b8\uc640 \ub2ec\ub9ac, AWS SAM CLI\ub294 \ub85c\uceec\uc5d0\uc11c \ud638\uc2a4\ud305\ud558\ub294 Docker \ucee8\ud14c\uc774\ub108\uc5d0\uc11c \ucf54\ub4dc\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4. \ub610\ud55c \ub85c\uceec\uc5d0\uc11c \ud638\uc2a4\ud305\ud558\ub294 API \uac8c\uc774\ud2b8\uc6e8\uc774 \ud504\ub85d\uc2dc\ub97c \uc2dc\ubbac\ub808\uc774\uc158\ud558\uc5ec \ucef4\ud3ec\ub10c\ud2b8 \ud1b5\ud569 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>AWS SAM CLI\ub97c \uc124\uce58\ud55c \ub2e4\uc74c, Lambda \ud568\uc218\ub97c \ub098\ud0c0\ub0b4\ub294 \ud15c\ud50c\ub9bf\uc744 \uc0dd\uc131\ud558\uc5ec \ub85c\uceec \ud1b5\ud569 \ud14c\uc2a4\ud2b8\ub97c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud15c\ud50c\ub9bf\uc744 \uc0dd\uc131\ud558\ub824\uba74 \uc544\ub798 \ucf58\ud150\uce20\ub97c \ud3ec\ud568\ud55c <em>template.yaml<\/em> \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\uc5ec <em>DebuggingExample<\/em> \ub514\ub809\ud130\ub9ac\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-yaml\">AWSTemplateFormatVersion: '2010-09-09'\nTransform: AWS::Serverless-2016-10-31\nDescription: Sample SAM Template for DebuggingExample\n\n# More info about Globals: https:\/\/github.com\/awslabs\/serverless-application-model\/blob\/master\/docs\/globals.rst\nGlobals:\n    Function:\n        Timeout: 10\n\nResources:\n\n    DebuggingExampleFunction:\n        Type: AWS::Serverless::Function # More info about Function Resource: https:\/\/github.com\/awslabs\/serverless-application-model\/blob\/master\/versions\/2016-10-31.md#awsserverlessfunction\n        Properties:\n            FunctionName: DebuggingExample\n\t\t\tCodeUri: src\/DebuggingExample\/bin\/Release\/netcoreapp2.1\/publish\n            Handler: DebuggingExample::DebuggingExample.Functions::Get\n            Runtime: dotnetcore2.1\n            Environment: # More info about Env Vars: https:\/\/github.com\/awslabs\/serverless-application-model\/blob\/master\/versions\/2016-10-31.md#environment-object\n                Variables:\n                    PARAM1: VALUE\n            Events:\n                DebuggingExample:\n                    Type: Api # More info about API Event Source: https:\/\/github.com\/awslabs\/serverless-application-model\/blob\/master\/versions\/2016-10-31.md#api\n                    Properties:\n                        Path: \/\n                        Method: get\n\nOutputs:\n\n    DebuggingExampleApi:\n      Description: &quot;API Gateway endpoint URL for Prod stage for Debugging Example function&quot;\n      Value: !Sub &quot;https:\/\/${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com\/Prod\/DebuggingExample\/&quot;\n\n    DebuggingExampleFunction:\n      Description: &quot;Debugging Example Lambda Function ARN&quot;\n      Value: !GetAtt DebuggingExampleFunction.Arn\n\n    DebuggingExampleFunctionIamRole:\n      Description: &quot;Implicit IAM Role created for Debugging Example function&quot;\n      Value: !GetAtt DebuggingExampleFunctionRole.Arn<\/code><\/pre>\n<p>\uc774\uc81c AWS SAM CLI \ud15c\ud50c\ub9bf\uc774 \uc0dd\uc131\ub418\uc5c8\uc73c\ub2c8 \ucf54\ub4dc\ub97c \ub85c\uceec\uc5d0\uc11c \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Lambda \ud568\uc218\ub294 API \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0\uc11c \uc694\uccad\uc744 \uc218\uc2e0\ud558\ubbc0\ub85c \uc0d8\ud50c API \uac8c\uc774\ud2b8\uc6e8\uc774 \uc694\uccad\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4. \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>sam local generate-event api &gt; testApiRequest.json<\/code><\/pre>\n<p>\uc774\uc81c \ub2e4\uc74c\uacfc \uac19\uc774 \uc0d8\ud50c \uc694\uccad\uc744 \uc804\ub2ec\ud558\uc5ec <em>DebuggingExample<\/em> \ucf54\ub4dc\ub97c \ub85c\uceec\ub85c \uac8c\uc2dc\ud558\uace0 \ud638\ucd9c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>dotnet publish -c Release\nsam local invoke &quot;DebuggingExampleFunction&quot; --event testApiRequest.json<\/code><\/pre>\n<p>\ucc98\uc74c \uc2e4\ud589\ud560 \ub54c\ub294 Lambda \ud568\uc218\ub97c \ud638\uc2a4\ud305\ud560 \ucee8\ud14c\uc774\ub108 \uc774\ubbf8\uc9c0\ub97c \uac00\uc838\uc624\ub294 \ub370 \uc2dc\uac04\uc774 \uc870\uae08 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud55c \ubc88 \ud638\ucd9c\ud55c \ud6c4\uc5d0\ub294 \ucee8\ud14c\uc774\ub108 \uc774\ubbf8\uc9c0\uac00 \ub85c\uceec\ub85c \uce90\uc2dc\ub418\ubbc0\ub85c \uc2e4\ud589\uc774 \ube68\ub77c\uc9d1\ub2c8\ub2e4.<\/p>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc0d8\ud50c \uc694\uccad\uc744 \uc804\uc1a1\ud574 \uae30\ub2a5\uc744 \ud14c\uc2a4\ud2b8\ud558\ub294 \ub300\uc2e0 \ub85c\uceec\uc5d0\uc11c API \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc2e4\ud589\ud558\uc5ec \uc2e4\uc81c API \uac8c\uc774\ud2b8\uc6e8\uc774 \uc694\uccad\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud14c\uc2a4\ud2b8\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>sam local start-api<\/code><\/pre>\n<p>\uc774\uc81c \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c http:\/\/127.0.0.1:3000\/\uc73c\ub85c \uc774\ub3d9\ud558\uba74 API \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ac\uc6a9\ud574 \ub85c\uceec\ub85c \ud638\uc2a4\ud305\ub418\ub294 Lambda \ud568\uc218\ub85c \uc694\uccad\uc744 \uc804\uc1a1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c \uacb0\uacfc\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5066\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/1b6453892473a467d07372d45eb05abc2031647a\/2018\/09\/19\/local-api-test.png\" alt=\"\" width=\"600\" height=\"275\" \/><\/p>\n<h3>CloudWatch\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8 \ub85c\uae45<\/h3>\n<p>\ud14c\uc2a4\ud2b8 \uc804\ub7b5\uc744 \uc138\uc6b4 \ud6c4\uc5d0\ub294 \uc774\uc5d0 \uae30\ubc18\ud558\uc5ec Lambda \ud568\uc218\ub97c \uc2e4\ud589\ud558\uace0, \ud14c\uc2a4\ud2b8\ud558\uace0, \ub514\ubc84\uae45\ud574\uc57c \ud569\ub2c8\ub2e4. AWS\uc5d0 \ud568\uc218\ub97c \ubc30\ud3ec\ud55c \uc774\ud6c4\uc5d0\ub294 \ubc30\ud3ec\ub41c \uae30\ub2a5 \ud65c\ub3d9\uc744 \uae30\ub85d\ud558\uc5ec \ub3d9\uc791\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>Lambda \ud568\uc218\uc5d0 \ub85c\uae45\uc744 \ucd94\uac00\ud558\ub294 \uac00\uc7a5 \uc26c\uc6b4 \ubc29\ubc95\uc740 CloudWatch\uc5d0 \uc774\ubca4\ud2b8\ub97c \uc4f0\ub294 \ucf54\ub4dc\ub97c \ucd94\uac00\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc744 \uc218\ud589\ud558\ub824\uba74 \uc0c8 \uba54\uc11c\ub4dc <em>LogMessage()<\/em>\ub97c <em>src\/DebuggingExample\/Function.cs<\/em> \ud30c\uc77c\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">void LogMessage(ILambdaContext ctx, string msg)\n{\n    ctx.Logger.LogLine(\n        string.Format(&quot;{0}:{1} - {2}&quot;, \n            ctx.AwsRequestId, \n            ctx.FunctionName,\n            msg));\n}<\/code><\/pre>\n<p>\uc774 \uba54\uc11c\ub4dc\ub294 Lambda \ud568\uc218\uc758 <em>Get()<\/em> \uba54\uc11c\ub4dc\uc5d0\uc11c <em>context<\/em> \uac1d\uccb4\ub97c \uac00\uc838\uc628 \ub2e4\uc74c, \ucee8\ud14d\uc2a4\ud2b8 \uac1d\uccb4\uc758 <em>Logger.Logline()<\/em> \uba54\uc11c\ub4dc\ub97c \ud638\ucd9c\ud558\uc5ec CloudWatch\uc5d0 \uba54\uc2dc\uc9c0\ub97c \uc804\ub2ec\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c <em>Get()<\/em> \uba54\uc11c\ub4dc\uc758 <em>LogMessage<\/em>\uc5d0 \ud638\ucd9c\uc744 \ucd94\uac00\ud558\uc5ec CloudWatch\uc5d0\uc11c \uc774\ubca4\ud2b8\ub97c \uae30\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <em>Try\u2026 Catch\u2026<\/em> \ube14\ub85d\uc744 \ucd94\uac00\ud558\uc5ec \uc608\uc678\ub3c4 \ud568\uaed8 \uae30\ub85d\ud558\ub294 \uac83\uc744 \ucd94\ucc9c\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">        public APIGatewayProxyResponse Get(APIGatewayProxyRequest request, ILambdaContext context)\n        {\n            LogMessage(context, &quot;Processing request started&quot;);\n\n            APIGatewayProxyResponse response;\n            try\n            {\n                var result = processor.CurrentTimeUTC();\n                response = CreateResponse(result);\n\n                LogMessage(context, &quot;Processing request succeeded.&quot;);\n            }\n            catch (Exception ex)\n            {\n                LogMessage(context, string.Format(&quot;Processing request failed - {0}&quot;, ex.Message));\n                response = CreateResponse(null);\n            }\n\n            return response;\n        }<\/code><\/pre>\n<p>\ubcc0\uacbd\uc73c\ub85c \uc778\ud574 \uc190\uc0c1\ub41c \ubd80\ubd84\uc774 \uc5c6\ub294\uc9c0 \ud655\uc778\ud558\ub824\uba74 \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \ub2e4\uc2dc \uc2e4\ud589\ud569\ub2c8\ub2e4. \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \uc7ac \uc2e4\ud589 \ud558\ub824\uba74 \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>cd test\/DebuggingExample.Tests\/\ndotnet test<\/code><\/pre>\n<h3>X-Ray\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2e4\ud589 \ucd94\uc801<\/h3>\n<p>\uc774\uc81c \ucf54\ub4dc\uac00 CloudWatch\uc5d0 \uc774\ubca4\ud2b8\ub97c \uae30\ub85d\ud569\ub2c8\ub2e4. CloudWatch\ub294 \ubb38\uc81c \ubaa8\ub2c8\ud130\ub9c1 \ubc0f \uc9c4\ub2e8\uc744 \uc704\ud55c \uacac\uace0\ud55c \uba54\ucee4\ub2c8\uc998\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\ubfd0\ub9cc \uc544\ub2c8\ub77c \ud2b9\ud788 \ub2e4\ub978 \uc11c\ube44\uc2a4\uc5d0 \uc758\ud574 \ud638\ucd9c\ub418\uac70\ub098 \ub2e4\ub978 \uc11c\ube44\uc2a4\ub97c \ud638\ucd9c\ud558\ub294 \uacbd\uc6b0 Lambda \ud568\uc218\uc758 \uc2e4\ud589\uc744 \ucd94\uc801\ud558\uc5ec \uc131\ub2a5 \ub610\ub294 \uc5f0\uacb0 \ubb38\uc81c\ub97c \uc9c4\ub2e8\ud558\uae30\uc5d0\ub3c4 \uc720\uc6a9\ud569\ub2c8\ub2e4. X-Ray\ub294 \ucf54\ub4dc \uc2e4\ud589\uc758 \ubd84\uc11d \ubc0f \ucd94\uc801\uc5d0 \ub3c4\uc6c0\uc774 \ub418\ub294 \ub2e4\uc591\ud55c \uae30\ub2a5\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\ud568\uc218\uc5d0\uc11c&nbsp;<a href=\"https:\/\/docs.aws.amazon.com\/lambda\/latest\/dg\/enabling-x-ray.html\" target=\"_blank\" rel=\"noopener\">\ud2b8\ub808\uc774\uc2a4 \uae30\ub2a5\uc744 \ud65c\uc131\ud654<\/a>\ud558\ub824\uba74 \uc774\uc804\uc5d0 \uc0dd\uc131\ud55c SAM \ud15c\ud50c\ub9bf\uc744 \uc218\uc815\ud558\uc5ec \ud568\uc218 \ub9ac\uc18c\uc2a4 \uc815\uc758\uc5d0 \uc0c8 \uc18d\uc131\uc744 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4. SAM\uc744 \uc0ac\uc6a9\ud558\uba74 <a href=\"https:\/\/github.com\/awslabs\/serverless-application-model\/blob\/master\/versions\/2016-10-31.md#awsserverlessfunction\">Tracing \uc18d\uc131<\/a>\uc744 \ucd94\uac00\ud558\uace0 <em>template.yaml<\/em> \ud30c\uc77c\uc758 <strong>Globals<\/strong> \uc139\uc158\uc5d0 \uc788\ub294 <strong>Timeout<\/strong> \ud2b9\uc131 \uc544\ub798\uc5d0 <em>Active<\/em>\ub85c \uc9c0\uc815\ud558\uc5ec \uc27d\uac8c \uc801\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-yaml\">Globals:\n    Function:\n        Timeout: 10\n        Tracing: Active<\/code><\/pre>\n<p>.NET Core \ucf54\ub4dc\uc5d0\uc11c X-Ray\ub97c \ud638\ucd9c\ud558\ub824\uba74, <em>src\/DebuggingExample<\/em> \ud3f4\ub354\uc5d0\uc11c \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc5ec <em>AWSSDKXRayRecoder<\/em>\ub97c \uc194\ub8e8\uc158\uc5d0 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<pre><code>dotnet add package AWSXRayRecorder \u2013-version 2.2.1-beta<\/code><\/pre>\n<p>\ub2e4\uc74c <em>using<\/em> \ubb38\uc744 <em>src\/DebuggingExample\/Function.cs<\/em> \ud30c\uc77c\uc758 \ub9e8 \uc704\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">using Amazon.XRay.Recorder.Core;<\/code><\/pre>\n<p>\uc0c8 \uba54\uc11c\ub4dc\ub97c <em>Function<\/em> \ud074\ub798\uc2a4\uc5d0 \ucd94\uac00\ud569\ub2c8\ub2e4. \uc774 \ud074\ub798\uc2a4\ub294 \ud568\uc218\uc640 \uc774\ub984\uc744 \uac00\uc838\uc628 \ub2e4\uc74c, X-Ray \ud558\uc704 \uc138\uadf8\uba3c\ud2b8\ub97c \uae30\ub85d\ud558\uc5ec \ud568\uc218\uc758 \uc2e4\ud589\uc744 \ucd94\uc801\ud569\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">        private T TraceFunction&lt;T&gt;(Func&lt;T&gt; func, string subSegmentName)\n        {\n            AWSXRayRecorder.Instance.BeginSubsegment(subSegmentName);\n            T result = func();\n            AWSXRayRecorder.Instance.EndSubsegment();\n\n            return result;\n        } <\/code><\/pre>\n<p>\uc774\uc81c <em>Get()<\/em> \uba54\uc11c\ub4dc\ub97c \uc5c5\ub370\uc774\ud2b8 \ud569\uc2dc\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">var result = processor.CurrentTimeUTC();<\/code><\/pre>\n<p>\uc704\uc758 \ud589\uc744 \ub2e4\uc74c \ud589\uc73c\ub85c \ubc14\uafc9\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">var result = TraceFunction(processor.CurrentTimeUTC, &quot;GetTime&quot;);<\/code><\/pre>\n<p><em>Function.cs<\/em>\uc758 \ucd5c\uc885 \ubc84\uc804\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"lang-csharp\">using System;\nusing System.Collections.Generic;\nusing System.Net;\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.APIGatewayEvents;\nusing Newtonsoft.Json;\nusing Amazon.XRay.Recorder.Core;\n\n\/\/ Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.\n[assembly: LambdaSerializer(\ntypeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]\n\nnamespace DebuggingExample\n{\n    public class Functions\n    {\n        ITimeProcessor processor = new TimeProcessor();\n\n        public APIGatewayProxyResponse Get(APIGatewayProxyRequest request, ILambdaContext context)\n        {\n            LogMessage(context, &quot;Processing request started&quot;);\n\n            APIGatewayProxyResponse response;\n            try\n            {\n                var result = TraceFunction(processor.CurrentTimeUTC, &quot;GetTime&quot;);\n                response = CreateResponse(result);\n\n                LogMessage(context, &quot;Processing request succeeded.&quot;);\n            }\n            catch (Exception ex)\n            {\n                LogMessage(context, string.Format(&quot;Processing request failed - {0}&quot;, ex.Message));\n                response = CreateResponse(null);\n            }\n\n            return response;\n        }\n\n        APIGatewayProxyResponse CreateResponse(DateTime? result)\n        {\n            int statusCode = (result != null) ?\n                (int)HttpStatusCode.OK :\n                (int)HttpStatusCode.InternalServerError;\n\n            string body = (result != null) ?\n                JsonConvert.SerializeObject(result) : string.Empty;\n\n            var response = new APIGatewayProxyResponse\n            {\n                StatusCode = statusCode,\n                Body = body,\n                Headers = new Dictionary&lt;string, string&gt;\n        {\n            { &quot;Content-Type&quot;, &quot;application\/json&quot; },\n            { &quot;Access-Control-Allow-Origin&quot;, &quot;*&quot; }\n        }\n            };\n\n            return response;\n        }\n\n        private void LogMessage(ILambdaContext context, string message)\n        {\n            context.Logger.LogLine(string.Format(&quot;{0}:{1} - {2}&quot;, context.AwsRequestId, context.FunctionName, message));\n        }\n\n        private T TraceFunction&lt;T&gt;(Func&lt;T&gt; func, string actionName)\n        {\n            AWSXRayRecorder.Instance.BeginSubsegment(actionName);\n            T result = func();\n            AWSXRayRecorder.Instance.EndSubsegment();\n\n            return result;\n        }\n    }\n}<\/code><\/pre>\n<p>AWS X-Ray\uc5d0\ub294 \ucd94\uc801 \uc815\ubcf4\ub97c \uc218\uc9d1\ud558\ub294 \uc5d0\uc774\uc804\ud2b8\uac00 \ud544\uc694\ud558\ubbc0\ub85c \ucf54\ub4dc\ub97c \ub85c\uceec\ub85c \ud14c\uc2a4\ud2b8\ud558\ub824\uba74 <a href=\"https:\/\/docs.aws.amazon.com\/xray\/latest\/devguide\/xray-daemon-local.html\" target=\"_blank\" rel=\"noopener\">AWS X-Ray \uc5d0\uc774\uc804\ud2b8<\/a>\ub97c \uc124\uce58\ud574\uc57c \ud569\ub2c8\ub2e4. \ud574\ub2f9 \uc5d0\uc774\uc804\ud2b8\uac00 \uc124\uce58\ub418\uba74 \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uc5ec \ubcc0\uacbd\uc73c\ub85c \uc778\ud574 \uc190\uc0c1\ub41c \ud56d\ubaa9\uc774 \uc5c6\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>cd test\/DebuggingExample.Tests\/\ndotnet test<\/code><\/pre>\n<p>.NET Core\uc5d0\uc11c X-Ray\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/docs.aws.amazon.com\/xray\/latest\/devguide\/aws-xray.html\" target=\"_blank\" rel=\"noopener\">AWS X-Ray \uac1c\ubc1c\uc790 \uc548\ub0b4\uc11c<\/a>\uc5d0\uc11c \ud655\uc778\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4. Visual Studio\uc5d0\uc11c X-Ray \uc9c0\uc6d0 \ucd94\uac00\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/aws.amazon.com\/blogs\/developer\/new-aws-x-ray-net-core-support\/\" target=\"_blank\" rel=\"noopener\">\uc0c8\ub85c\uc6b4 AWS X-Ray .NET Core \uc9c0\uc6d0<\/a> \uac8c\uc2dc\ubb3c\uc744 \ucc38\uc870\ud558\uc138\uc694.<\/p>\n<h3>\uc6d0\uaca9\uc73c\ub85c Lambda \ud568\uc218 \ubc30\ud3ec \ubc0f \ud14c\uc2a4\ud2b8<\/h3>\n<p>Lambda \ud568\uc218\ub97c \uc0dd\uc131\ud558\uace0 \ub85c\uceec\ub85c \ud14c\uc2a4\ud2b8\ud55c \ud6c4\uc5d0\ub294 \ucf54\ub4dc\ub97c \ud328\ud0a4\uc9d5\ud558\uace0 \ubc30\ud3ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800, \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud560 Amazon S3 \ubc84\ud0b7\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. \uc544\uc9c1 Amazon S3 \ubc84\ud0b7\uc774 \uc5c6\ub2e4\uba74 <a href=\"https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/gsg\/CreatingABucket.html\" target=\"_blank\" rel=\"noopener\">\uc801\uc808\ud55c S3 \ubc84\ud0b7\uc744 \uc0dd\uc131<\/a>\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\uc81c .NET Lambda \ud568\uc218\ub97c \ud328\ud0a4\uc9d5\ud558\uace0 Amazon S3\uc5d0 \ubcf5\uc0ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>sam package \n  --template-file template.yaml \n  --output-template debugging-example.yaml \n  --s3-bucket debugging-example-deploy<\/code><\/pre>\n<p>\ub9c8\uc9c0\ub9c9\uc73c\ub85c \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc5ec Lambda \ud568\uc218\ub97c \ubc30\ud3ec\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>sam deploy \n   --template-file debugging-example.yaml \n   --stack-name DebuggingExample \n   --capabilities CAPABILITY_IAM \n   --region eu-west-1<\/code><\/pre>\n<p>\ucf54\ub4dc\uac00 \uc131\uacf5\uc801\uc73c\ub85c \ubc30\ud3ec\ub41c \ud6c4 \ub2e4\uc74c \uba85\ub839\uc744 \uc2e4\ud589\ud558\uc5ec \ub85c\uceec \uba38\uc2e0\uc5d0\uc11c \ucf54\ub4dc\ub97c \ud14c\uc2a4\ud2b8\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>dotnet lambda invoke-function DebuggingExample -\u2013region eu-west-1<\/code><\/pre>\n<h3>Lambda \ud568\uc218 \uc9c4\ub2e8<\/h3>\n<p>Lambda \ud568\uc218\ub97c \uc2e4\ud589\ud558\ub294 \ub3d9\uc548 AWS Management Console\uc5d0 \ub85c\uadf8\uc778\ud558\uace0 <strong>CloudWatch Logs<\/strong>\ub85c \uc774\ub3d9\ud558\uc5ec \ud568\uc218\uc758 \ub3d9\uc791\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.&nbsp;<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5064\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/1b6453892473a467d07372d45eb05abc2031647a\/2018\/09\/19\/cloudwatch-logs.png\" alt=\"CloudWatch Logs \ucf58\uc194\" width=\"700\" height=\"315\" \/><\/p>\n<p>\uc774\uc81c <em>\/aws\/lambda\/DebuggingExample<\/em> \ub85c\uadf8 \uadf8\ub8f9\uc744 \ud074\ub9ad\ud558\uc5ec Lambda \ud568\uc218\uc758 \ubaa8\ub4e0 \uae30\ub85d\ub41c \ub85c\uadf8 \uc2a4\ud2b8\ub9bc\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub85c\uadf8 \uc2a4\ud2b8\ub9bc \uc911 \ud558\ub098\ub97c \uc5f4\uba74 <em>Get()<\/em> \uba54\uc11c\ub4dc \ub0b4\uc5d0\uc11c \uba85\uc2dc\uc801\uc73c\ub85c \uae30\ub85d\ub41c \uc774\ubca4\ud2b8 2\uac1c\ub97c \ud3ec\ud568\ud558\uc5ec Lambda \ud568\uc218\uc5d0 \ub300\ud574 \uae30\ub85d\ub41c \ub2e4\uc591\ud55c \uba54\uc2dc\uc9c0\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5063\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/1b6453892473a467d07372d45eb05abc2031647a\/2018\/09\/19\/lambda-logs.png\" alt=\"Lambda CloudWatch Logs\" width=\"700\" height=\"216\" \/><\/p>\n<p>\ub85c\uadf8\ub97c \ub85c\uceec\uc5d0\uc11c \uac80\ud1a0\ud558\ub824\uba74 AWS SAM CLI\ub97c \ud1b5\ud574 CloudWatch \ub85c\uadf8\ub97c \uac80\uc0c9\ud558\uc5ec \ud130\ubbf8\ub110\uc5d0 \ub85c\uadf8\ub97c \ud45c\uc2dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code>sam logs -n DebuggingExample --region eu-west-1<\/code><\/pre>\n<p>\ub2e4\ub978 \ubc29\ubc95\uc73c\ub85c\ub294 Test on the Lambda \ucf58\uc194\uc5d0\uc11c Test\ub97c \uc120\ud0dd\ud558\uc5ec Lambda \ud568\uc218\ub97c \uc2e4\ud589\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uacbd\uc6b0, \uc2e4\ud589 \uacb0\uacfc\uac00 <strong>Log output<\/strong> \uc139\uc158\uc5d0 \ub098\ud0c0\ub0a9\ub2c8\ub2e4.&nbsp;<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5062\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/1b6453892473a467d07372d45eb05abc2031647a\/2018\/09\/19\/lambda-execution.png\" alt=\"Lambda \ucf58\uc194 \uc2e4\ud589\" width=\"700\" height=\"385\" \/><\/p>\n<p>X-Ray \ucf58\uc194\uc5d0\uc11c <strong>Service Map<\/strong> \ud398\uc774\uc9c0\uc5d0\ub294 Lambda \ud568\uc218\uc758 \uc5f0\uacb0\uc5d0 \ub300\ud55c \ub9f5\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n<p>Lambda \ud568\uc218\ub294 \ubcf8\uc9c8\uc801\uc73c\ub85c \ub3c5\ub9bd \uc2e4\ud589\ud615(standalone)\uc785\ub2c8\ub2e4. \uadf8\ub7ec\ub098 Lambda \ud568\uc218\uac00 \ub2e4\uc218\uc758 \ub2e4\ub978 \uc11c\ube44\uc2a4\uc5d0 \uc5f0\uacb0\ub41c \uacbd\uc6b0\uc5d0\ub294 <strong>Service Map<\/strong> \ud398\uc774\uc9c0\ub97c \ud1b5\ud574 \uc131\ub2a5 \ubb38\uc81c\ub97c \ud30c\uc545\ud558\ub294 \ub370 \uc911\uc694\ud55c \uc815\ubcf4\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5061\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/1b6453892473a467d07372d45eb05abc2031647a\/2018\/09\/19\/service-map.png\" alt=\"X-Ray \uc11c\ube44\uc2a4 \ub9f5\" width=\"650\" height=\"256\" \/><\/p>\n<p><strong>Traces<\/strong> \ud654\uba74\uc744 \uc5f4\uba74 \uae30\ub85d\ub41c \ubaa8\ub4e0 \ucd94\uc801 \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc8fc\ub294 \ucd94\uc801 \ubaa9\ub85d\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4. \ucd94\uc801 \uc911 \ud558\ub098\ub97c \uc5f4\uba74 Lambda \ud568\uc218 \uc131\ub2a5\uc758 \uc0c1\uc138 \ub0b4\uc5ed\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5060\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/1b6453892473a467d07372d45eb05abc2031647a\/2018\/09\/19\/traces.png\" alt=\"X-Ray Traces UI\" width=\"700\" height=\"259\" \/><\/p>\n<h3>\uacb0\ub860<\/h3>\n<p>\uc774 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 .NET Core \uae30\ubc18\uc758 Lambda \ud568\uc218\ub97c \uac1c\ubc1c\ud558\ub294 \ubc29\ubc95, \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95, AWS SAM CLI\ub97c \ub85c\uceec \ud1b5\ud569 \ud14c\uc2a4\ud2b8\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95, CloudWatch\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\ubca4\ud2b8\ub97c \uae30\ub85d\ud558\uace0 \ubaa8\ub2c8\ud130\ub9c1\ud558\ub294 \ubc29\ubc95\uacfc \ub9c8\uc9c0\ub9c9\uc73c\ub85c X-Ray\ub97c \uc0ac\uc6a9\ud558\uc5ec Lambda \ud568\uc218 \uc2e4\ud589\uc744 \ucd94\uc801\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4 \ubd24\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7ec\ud55c \uae30\uc220\uc740 Lambda \ud568\uc218\ub97c \ud6a8\uacfc\uc801\uc73c\ub85c \ub514\ubc84\uae45\ud558\uace0 \uc9c4\ub2e8\ud558\ub294 \ub370 \uc720\uc6a9\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uacac\uace0\ud55c \uae30\ubc18\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ud504\ub85c\ub355\uc158 \uc6cc\ud06c\ub85c\ub4dc\uc758 \uacbd\uc6b0, \uc911\ub2e8 \uc5c6\ub294 \ud0c1\uc6d4\ud55c \uace0\uac1d \uacbd\ud5d8\uc744 \uc81c\uacf5\ud558\uae30 \uc704\ud574 \uc9c4\ub2e8\uc774 \ud575\uc2ec\uc801\uc778 \uc5ed\ud560\uc744 \ud558\ubbc0\ub85c \uac01 \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \ub0b4\uc6a9\uc744 \uc880 \ub354 \uc0b4\ud3b4\ubcf4\ub294 \uac83\uc744 \ucd94\ucc9c\ud569\ub2c8\ub2e4.<\/p>\n<p>\u2013 Chris Munns;<\/p>\n<footer><\/footer>\n<div>\n <em>\uc774 \uae00\uc740<a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/\"> AWS Compute Blog<\/a>\uc758 <a href=\"https:\/\/aws.amazon.com\/blogs\/compute\/developing-net-core-aws-lambda-functions\/\">Developing .NET Core AWS Lambda functions<\/a>\uc758 \ud55c\uad6d\uc5b4 \ubc88\uc5ed\uc73c\ub85c AWS \ud504\ub85c\ud398\uc154\ub110 \uc11c\ube44\uc2a4\ud300\uc758 \uc5f0\ub098\ub77c \ucee8\uc124\ud134\ud2b8\uac00 \uac10\uc218\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/em>\n<\/div>\n<p>\n <!-- SiteCatalyst code version: H.25.1. Copyright 1996-2012 Adobe, Inc. All Rights Reserved --><\/p>\n<p>Source: <a href=\"https:\/\/aws.amazon.com\/ko\/blogs\/korea\/developing-net-core-aws-lambda-functions\/\" target=\"_blank\">AWS Lambda \ud568\uc218\ub85c .NET \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\ud558\uae30<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>AWS Lambda \ud568\uc218\ub85c .NET \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\ud558\uae30 AWS Lambda \ud568\uc218\uac00 \uc81c\uacf5\ud558\ub294 \uac00\uc7a5 \ud070 \uc774\uc810 \uc911 \ud558\ub098\ub294 \uac1c\ubc1c \uc791\uc5c5\uc744 \uae30\ubc18 \uc778\ud504\ub77c\uc640 \uaca9\ub9ac\ud55c\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uaca9\ub9ac\ub294 \ucf54\ub4dc \ubc30\ud3ec\uc640 \uad00\ub9ac\ub97c \uc6a9\uc774\ud558\uac8c \ud558\uc9c0\ub9cc, \ud14c\uc2a4\ud2b8\uc640 \ub514\ubc84\uae45 \ubc0f \ubb38\uc81c \uc9c4\ub2e8\uc744 \uc704\ud55c \uc811\uadfc \ubc29\uc2dd\uc744 \ubd84\uba85\ud788 \uc815\uc758\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774\ub97c \uc9c0\uc6d0\ud558\ub294 \ubc29\ubc95\uc73c\ub85c AWS \uc11c\ube44\uc2a4\ub97c \ud65c\uc6a9\ud55c \ub2e4\uc591\ud55c \ubaa8\ubc94 \uc0ac\ub840\uac00 \uc788\uc9c0\ub9cc .NET \uae30\ubc18\uc73c\ub85c Lambda \ud568\uc218\ub97c \uac1c\ubc1c\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \uc544\ub798 \ub124 \uac00\uc9c0 \ubc29\ubc95\uc744 \ub530\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub3c5\ub9bd\ub41c \uae30\ub2a5 \uc218\uc900\uc758 \ud14c\uc2a4\ud2b8\uc640 \ub514\ubc84\uae45\uc744 \uc704\ud55c \ub2e8\uc704 \ud14c\uc2a4\ud2b8 \uc218\ud589 AWS Serverless Application Model CLI(AWS SAM)\ub97c \uc0ac\uc6a9\ud55c \ub85c\uceec \ud1b5\ud569 \ud14c\uc2a4\ud2b8 Amazon CloudWatch \ub85c\uae45\uc744 \uc0ac\uc6a9\ud55c \uc774\ubca4\ud2b8 \ubc0f \uc624\ub958 \uae30\ub85d AWS X-Ray\uc758 \ub808\ucf54\ub529\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc11c\ube44\uc2a4 \uc804\uccb4\uc5d0 \uac78\uce5c \uc2e4\ud589 \ucd94\uc801 \uc774 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \ud604\uc7ac\uc758 UTC \uc2dc\uac04\uc744 \ubc18\ud658\ud558\ub294 \ub2e8\uc21c\ud55c Lambda \ud568\uc218\ub97c Amazon API Gateway \uae30\ubc18\uc73c\ub85c \ub9cc\ub4e4\uc5b4\uc9c4 \uac8c\uc774\ud2b8\uc6e8\uc774\uc5d0\uc11c \ud638\ucd9c\ud558\ub294 \ub370\ubaa8\ub97c \uc218\ud589\ud569\ub2c8\ub2e4. \uc774 \ub370\ubaa8\ub97c \uae30\uc900\uc73c\ub85c \uc190\uc26c\uc6b4 \ub514\ubc84\uae45, \ub85c\uae45 \ubc0f \ucd94\uc801\uc744 \uc704\ud55c \ucf54\ub4dc\ub97c \uc124\uacc4\ud558\ub294 \ubc29\ubc95\uc744 \uc18c\uac1c \ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc774\uc804\uc5d0 .NET Core \uae30\ubc18\uc758 Lambda \ud568\uc218\ub97c \uc0dd\uc131\ud55c \uc801\uc774 \uc5c6\ub2e4\uba74 \ub2e4\uc74c <a class=\"mh-excerpt-more\" href=\"https:\/\/jirak.net\/wp\/aws-lambda-%ed%95%a8%ec%88%98%eb%a1%9c-net-%ec%95%a0%ed%94%8c%eb%a6%ac%ec%bc%80%ec%9d%b4%ec%85%98-%ea%b0%9c%eb%b0%9c%ed%95%98%ea%b8%b0\/\" title=\"AWS Lambda \ud568\uc218\ub85c .NET \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\ud558\uae30\">[ more&#8230; ]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":28413,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[169],"tags":[656],"class_list":["post-28412","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-aws"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/28412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/comments?post=28412"}],"version-history":[{"count":1,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/28412\/revisions"}],"predecessor-version":[{"id":28414,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/28412\/revisions\/28414"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/media\/28413"}],"wp:attachment":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/media?parent=28412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/categories?post=28412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/tags?post=28412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}