AWS Lambda에
.NET Core
프로젝트를 배포하는 과정을 적어볼 예정이다.
AWS 공식 문서를 참고하여 진행한다. AWS에서는 Visual Studio 2017/2019에 대한 공식 문서만 제공하고 있다.
Visual Studio 2022(이하 VS2022)
는 아직 공식 문서가 작성되진 않았지만, VS2022
를 지원하는 AWS Toolkit Preview는 제공되고 있으니 일단 설치해보기로 한다.
> AWS Toolkit for Visual Studio Download
위에서 언급한 내용대로 VS2022
로 설치한다.
[install] 버튼 1회만 클릭하면 그리 오래걸리지 않는 시간내에 설치가 완료된다. 솔직히 카톡 PC버전 설치보다 쉬운듯.
설치가 완료된 상태에서 VS2022
를 실행하게 되면 AWS 관련 템플릿들이 추가된 것을 볼 수 있다.
징그럽게 많다..
AWS Lambda Project (.NET Core - C#)
를 선택하고 프로젝트의 이름과 위치를 지정한다.
만들기를 클릭하면 위와 같이 Blueprint를 선택하는 창이 뜨는데 당황하지말고 Empty Function
을 선택하면 된다.
AWS IAM 콘솔에서 발급받은 Access Key와 Secret Key를 입력하고 Save 하면 된다. 혹시나 Secret Key를 분실한 경우 새로 발급받아야함.
정상적으로 연결되었다면 좌측에 AWS Explorer에 서비스들이 출력된다. 혹시나 여기서도 AWS Explorer가 생성되지 않았다면 [보기] -> [AWS Explorer] 또는 Ctrl + K, A 숏컷을 사용하면 된다.
솔루션 탐색기에 aws-lambda-tools-defaults.json
, Function.cs
파일이 있는데 해당 파일 설명은 AWS 공식 문서를 보는게 좋을 것 같다.
aws-lambda-tools-defaults.json
프로젝트의 일부로 생성된 파일을 보여줍니다. Lambda 도구가 기본적으로 읽는 이 파일의 필드를 사용하여 빌드 옵션을 설정할 수 있습니다. Visual Studio의 프로젝트 템플릿에는 기본값이 있는 이러한 필드가 많이 포함되어 있습니다. function-handler 필드는 Lambda 함수가 실행될 때 실행되는 메서드를 지정합니다. 함수 핸들러를 지정하는 경우 필드는 게시 마법사에 미리 채워져 있습니다. 함수, 클래스 또는 어셈블리의 이름을 바꾸면 aws-lambda-tools-defaults.json 파일의 필드도 업데이트해야 합니다.
{
"Information": [
"This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
"To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
"dotnet lambda help",
"All the command line options for the Lambda command can be specified in this file."
],
"profile": "",
"region": "",
"configuration": "Release",
"framework": "netcoreapp3.1",
"function-runtime": "dotnetcore3.1",
"function-memory-size": 256,
"function-timeout": 30,
"function-handler": "AWSLambda_basic::AWSLambda_basic.Function::FunctionHandler"
}
Function.cs
Lambda 함수로 노출할 C# 함수를 정의합니다. 이것은 FunctionHandlerLambda 함수가 실행될 때 실행되는 Lambda 기능입니다. 이 프로젝트에는 입력 텍스트 FunctionHandler를 호출하는 하나의 함수가 정의되어 ToUpper()있습니다.
// Function.cs
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 AWSLambda_basic
{
public class Function
{
/// <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 FunctionHandler(string input, ILambdaContext context)
{
return input?.ToUpper();
}
}
}
가장 기본적인 테스트만 진행할 계획이였기 때문에 Function.cs
에 기본적으로 작성되어있는 ToUpper()
기능으로 테스트를 진행할 예정이다.
AWS Explorer에서 AWS Lambda
우클릭 후 Publish to AWS Lambda
선택
실제로 프로젝트 진행시에는 .NET Core v3.1을 사용할 계획은 없지만 이번에는 반항하지 않고 AWS 공식 문서에서 시키는데로 따라해본다.
VS2019
, VS2017
과는 아주 조금 다른 창이 뜨는데 엄청 많이 다른건 아니니까 요령껏 작성했다.
다음 페이지에선 크게 만질만한 옵션이 없다 Role Name
만 AWSLambdaBasicExecutionRole
로 변경해주고 업로드한다.
업로드가 정상적으로 완료되면 업로드 윈도우가 자동으로 종료되고, AWS Explorer를 보면 AWS Lambda
에 방금 추가한 Function이 추가되어있다.
{
"errorType": "LambdaException",
"errorMessage": "Could not find the required 'AWSLambda_basic.deps.json'.
This file should be present at the root of the deployment package."
}
새롭게 생성된 Function 윈도우에서 샘플 테스트를 진행하는데 보고 따라했음에도 에러가 생긴다.
참 신기한 세상이다.
내 머리가 레전드인건지..
해당 오류는 *.deps.json
파일이 없어서 생기는 오류인데, *.deps.json
파일은 프로젝트를 publish하게 되면 .\bin\Debug\\{runtime}\publish\
디렉터리에 생성되는 파일이다.
AWS Lambda에 업로드하기 전에 Visual Studio에서 dotnet publish
후 파일 생성까지 확인.
dotnet publish
한 프로젝트를 다시 AWS Lambda
에 업로드했지만 해당 오류는 해결되지 않았다.
이래저래 테스트를 하던 중 AWS Lambda
업로드 중 Rold Name
을 기존 AWSLambdaBasicExecutionRole
에서 AWSLambdaRole (Default policy for AWS Lambda Service Role.)
으로 변경했고, AWS Lambda
에 업로드된 ToUpper()
함수는 정상적으로 동작했다.
한동안 기록없이 코드만 치다보니 감이 떨어진듯하다. 습관이 이렇게 무섭다.
앞으로 기록할 것들
AWS Lambda
에 업로드한 코드 수정하기(json parsing)dotnet publish
패키지 증발 현상AWS Lambda
함수와AWS API Gateway
연동하기AWS EC2 ubuntu
에Docker
환경 구축하기 +ASP.NET Core Docker Image
기록할 일이 많다는건 좋은 상황인지, 아닌지.