재우니의 블로그

asp.net core 3.1 을 통해 aws 의 Lambda 서비스를 배포하여 실행하는 간단한 예제 입니다.

이를 위한 초반에 설치 단계부터 배포 및 테스트 단계까지 알아보고자 합니다.

 

 

 

1. Amazon.Lambda.Tools 설치

 

C:\SourceFolder\AWS>dotnet tool install -g Amazon.Lambda.Tools

 

다음 명령을 사용하여 도구를 호출할 수 있습니다. dotnet-lambda 'amazon.lambda.tools' 도구('5.1.2' 버전)가 설치되었습니다.

 

2. Amazon.Lambda.Templates 설치

 

C:\SourceFolder\AWS>dotnet new -i Amazon.Lambda.Templates

 

템플릿 이름 약식 이름 언어 태그 ------------------------------------- -------------------------------------------- ---------- ---------------------- Order Flowers Chatbot Tutorial lambda.OrderFlowersChatbot [C#] AWS/Lambda/Function Lambda Custom Runtime Function (.N... lambda.CustomRuntimeFunction [C#],F# AWS/Lambda/Function Lambda Detect Image Labels lambda.DetectImageLabels [C#],F# AWS/Lambda/Function Lambda Empty Function lambda.EmptyFunction [C#],F# AWS/Lambda/Function Lambda Empty Function (.NET 5 Cont... lambda.image.EmptyFunction [C#],F# AWS/Lambda/Function Lex Book Trip Sample lambda.LexBookTripSample [C#] AWS/Lambda/Function Lambda Simple Application Load Bal... lambda.SimpleApplicationLoadBalancerFunction [C#] AWS/Lambda/Function Lambda Simple DynamoDB Function lambda.DynamoDB [C#],F# AWS/Lambda/Function Lambda Simple Kinesis Firehose Fun... lambda.KinesisFirehose [C#] AWS/Lambda/Function Lambda Simple Kinesis Function lambda.Kinesis [C#],F# AWS/Lambda/Function Lambda Simple S3 Function lambda.S3 [C#],F# AWS/Lambda/Function Lambda Simple SNS Function lambda.SNS [C#] AWS/Lambda/Function Lambda Simple SQS Function lambda.SQS [C#] AWS/Lambda/Function Lambda ASP.NET Core Web API serverless.AspNetCoreWebAPI [C#],F# AWS/Lambda/Serverless Lambda ASP.NET Core Web API (.NET ... serverless.image.AspNetCoreWebAPI [C#],F# AWS/Lambda/Serverless Lambda ASP.NET Core Web Applicatio... serverless.AspNetCoreWebApp [C#] AWS/Lambda/Serverless Serverless Detect Image Labels serverless.DetectImageLabels [C#],F# AWS/Lambda/Serverless Lambda DynamoDB Blog API serverless.DynamoDBBlogAPI [C#] AWS/Lambda/Serverless Lambda Empty Serverless serverless.EmptyServerless [C#],F# AWS/Lambda/Serverless Lambda Empty Serverless (.NET 5 Co... serverless.image.EmptyServerless [C#],F# AWS/Lambda/Serverless Lambda Giraffe Web App serverless.Giraffe F# AWS/Lambda/Serverless Serverless Simple S3 Function serverless.S3 [C#],F# AWS/Lambda/Serverless Step Functions Hello World serverless.StepFunctionsHelloWorld [C#],F# AWS/Lambda/Serverless Serverless WebSocket API serverless.WebSocketAPI [C#] AWS/Lambda/Serverless Console Application console [C#],F#,VB Common/Console Class library classlib [C#],F#,VB Common/Library WPF Application wpf [C#],VB Common/WPF WPF Class library wpflib [C#],VB Common/WPF WPF Custom Control Library wpfcustomcontrollib [C#],VB Common/WPF WPF User Control Library wpfusercontrollib [C#],VB Common/WPF Windows Forms App winforms [C#],VB Common/WinForms Windows Forms Control Library winformscontrollib [C#],VB Common/WinForms Windows Forms Class Library winformslib [C#],VB Common/WinForms Worker Service worker [C#],F# Common/Worker/Web Unit Test Project mstest [C#],F#,VB Test/MSTest NUnit 3 Test Project nunit [C#],F#,VB Test/NUnit NUnit 3 Test Item nunit-test [C#],F#,VB Test/NUnit xUnit Test Project xunit [C#],F#,VB Test/xUnit Razor Component razorcomponent [C#] Web/ASP.NET Razor Page page [C#] Web/ASP.NET MVC ViewImports viewimports [C#] Web/ASP.NET MVC ViewStart viewstart [C#] Web/ASP.NET Blazor Server App blazorserver [C#] Web/Blazor Blazor WebAssembly App blazorwasm [C#] Web/Blazor/WebAssembly ASP.NET Core Empty web [C#],F# Web/Empty ASP.NET Core Web App (Model-View-C... mvc [C#],F# Web/MVC ASP.NET Core Web App webapp [C#] Web/MVC/Razor Pages ASP.NET Core with Angular angular [C#] Web/MVC/SPA ASP.NET Core with React.js react [C#] Web/MVC/SPA ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA Razor Class Library razorclasslib [C#] Web/Razor/Library ASP.NET Core Web API webapi [C#],F# Web/WebAPI ASP.NET Core gRPC Service grpc [C#] Web/gRPC dotnet gitignore file gitignore Config global.json file globaljson Config NuGet Config nugetconfig Config Dotnet local tool manifest file tool-manifest Config Web Config webconfig Config Solution File sln Solution Protocol Buffer File proto Web/gRPC Examples: dotnet new mvc --auth Individual dotnet new serverless.WebSocketAPI dotnet new --help dotnet new serverless.AspNetCoreWebAPI --help

 

3. lambda.EmptyFunction 템플릿으로 "LambdaDemo" 프로젝트 생성

 

C:\SourceFolder\AWS>dotnet new lambda.EmptyFunction --name LambdaDemo

 

"Lambda Empty Function" 템플릿이 성공적으로 생성되었습니다.

vs 2019 툴로 열면 아래와 같이 구성된 파일이 존재합니다.

 

Function.cs 파일의 소스를 열면, System.TextJson 을 통해 모든 데이터를 직렬화 하는 것을 보실 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using Amazon.Lambda.Core;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace LambdaDemo
{
    public class DemoFunction
    {
        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public string DemoFunctionHandler(string input, ILambdaContext context)
        {
            context.Logger.Log($"get new message : {input}");
            return input?.ToUpper();
        }
    }
}

 

4. 배포하기

 

C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo>dotnet lambda deploy-function LambdaDemo

 

Zipping publish folder C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\publish to C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\LambdaDemo.zip ... zipping: Amazon.Lambda.Core.dll ... zipping: Amazon.Lambda.Serialization.SystemTextJson.dll ... zipping: LambdaDemo.deps.json ... zipping: LambdaDemo.dll ... zipping: LambdaDemo.pdb ... zipping: LambdaDemo.runtimeconfig.json Created publish archive (C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\LambdaDemo.zip).

Error retrieving configuration for function LambdaDemo: Unable to get IAM security credentials from EC2 Instance Metadata Service.

 

 

실행 후, "Error retrieving configuration for function LambdaDemo: Unable to get IAM security credentials from EC2 Instance Metadata Service." 라는 오류를 만나게 되었는데요.  이는 IAM 을 설정하지 않았기 때문에 발생한 오류 입니다.

 

IAM 화면에 가서 "역할 만들기" 버튼을 선택합니다.

 

 

AWS 서비스를 선택하고, Lamdba 를 선택한 다음, 다음 권한 버튼을 선택합니다.

 

 

dynamodb 를 검색하여 아래의 AmazonDynamoDBFullAccess 를 체크합니다.

 

 s3 의 검색을 통해 AmazonS3FullAccess 를 체크합니다. 

 

 

역할이름을 lambda-demo 라고 기재하고 "역할만들기"를 선택합니다.

 

 

 

생성된 역할이름인 lambda-demo 를 보실 수 있습니다. 

 

 

 

이제.. 다시 배포를 해볼가요?

 

C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo>dotnet lambda deploy-function LambdaDemo

 

여전히 위와 같이 오류가 발생합니다. aws configure 를 설정하지 않아서 발생한 부분일 수도 있습니다. 

 

C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo>aws configure

 

아래의 값을 하나씩 채워 입력해 주셔야 하는데요.  

 

AWS Access Key ID [None]: AKIA블라블라.~~
AWS Secret Access Key [None]: U+9IEP4Rmx블라블라
Default region name [None]: ap-northeast-2
Default output format [None]:

 

 

AWS Access Key 를 얻기 위해서는.. aws 사이트 접속하셔서 로그인을 한 다음, "내 보안 자격 증명" 을 선택합니다.

 

 

 

 

엑세스 키를 선택하면 "새 엑세스 키 만들기"를 통해 새롭게 키를 발급 받을 수 있습니다. 누르게 되면 생성완료 시간과 엑세스키 아이디를 보여줍니다. 이를 복사해서 "AWS Access Key ID" 를 물어보면 해당 값을 넣으시면 됩니다.

 

 

 

또한 크롬 브라우저에서 다운로드 되는 파일이 하나 존재하는데요. rootkey.csv 입니다. 이 파일은 잊어버리지 마시고 꼭 보관하시고요. 해당 파일을 메모장으로 열면 "AWS Secret Access Key" 를 보실 수 있습니다. 해당 부분을 복사해서 입력해 주세요.

 

 

다시 배포해 봅니다.

 

C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo>dotnet lambda deploy-function LambdaDemo

 

Executing publish command Deleted previous publish folder ... invoking 'dotnet publish', working folder 'C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\publish' ... dotnet publish --output "C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\publish" --configuration "Release" --framework "netcoreapp3.1" /p:GenerateRuntimeConfigurationFiles=true --runtime linux-x64 --self-contained false ... publish: .NET용 Microsoft (R) Build Engine 버전 16.10.0+4242f381a ... publish: Copyright (C) Microsoft Corporation. All rights reserved. ... publish: 복원할 프로젝트를 확인하는 중... ... publish: C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\LambdaDemo.csproj을(를) 160 ms 동안 복원했습니다. ... publish: LambdaDemo -> C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\linux-x64\LambdaDemo.dll ... publish: LambdaDemo -> C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\publish\ Zipping publish folder C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\publish to C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\LambdaDemo.zip ... zipping: Amazon.Lambda.Core.dll ... zipping: Amazon.Lambda.Serialization.SystemTextJson.dll ... zipping: LambdaDemo.deps.json ... zipping: LambdaDemo.dll ... zipping: LambdaDemo.pdb ... zipping: LambdaDemo.runtimeconfig.json Created publish archive (C:\SourceFolder\AWS\LambdaDemo\src\LambdaDemo\bin\Release\netcoreapp3.1\LambdaDemo.zip). Creating new Lambda function LambdaDemo

Select IAM Role that to provide AWS credentials to your code:
1) lambda-demo
2) *** Create new IAM Role ***
1
New Lambda function created

 

 

이제 오류없이 드디어 IAM Role 선택해라고 알려줍니다. 제가 만든 1) lambda-demo 를 선택합니다. 숫자 1 입력하고 엔터 치면 됩니다.

 

 

aws Lambda 서비스를 가면 "함수" 서브메뉴를 선택하면 저희가 배포한 LamdbaDemo  의 zip 파일이 업로드 된것을 보실 수 있습니다. 이제 이를 실행해 볼가요?

 

 

함수제목을 선택하면 아래 처럼 보기 화면이 제공되며, 1) 테스트 탭을 선택하고 나서 2) 에서 "I am Shim Jaewoon" 라는 문자열을 입력 한다음, 3) 테스트 버튼을 선택합니다. 4) 저희가 만든 lamdba 소스가 가동되어 결과를 세부정보에 보여줍니다.

 

 

 

참고 사이트

 

https://youtu.be/GZ8_anxgpK8

 

https://stackoverflow.com/questions/60815037/aws-dotnet-sdk-error-unable-to-get-iam-security-credentials-from-ec2-instance-m

 

https://adamtheautomator.com/aws-lambda-c/