Amazon Web Services 한국 블로그

AWS Toolkit for IntelliJ를 통해 손쉽게 서버리스 앱 배포해 보기

작년 re:Invent에서 AWS Toolkit for IntelliJ 작업이 진행 중임을 알려 드린바 있습니다. 그 이후로 이 툴킷은 GitHub에서 활발한 개발이 진행되어 왔으며, 지난 3월에 정식 출시 하였습니다.  이 툴킷은 서버리스 애플리케이션 개발을 위한 통합 환경을 제공합니다.

예를 들어, 이를 통해 다음과 같은 작업을 수행할 수 있습니다.

  • Java로 개발한 애플리케이션을 서버리스로 즉시 배포 가능
  • AWS Lambda와 유사한 실행 환경에서 단계별 디버깅을 이용해서 로컬에서 코드 테스트
  • 원하는 AWS 리전에 애플리케이션을 배포
  • Lambda 함수를 로컬 또는 원격에서 호출 .
  • Amazon S3Amazon API Gateway 및 Amazon SNS과 같은 다양한 이벤트 소스로부터 샘플 페이로드를 사용하거나 맞춤 설정 가능

이 글에서는 간단하게 AWS Toolkit for IntelliJ 사용 방법을 소개합니다.

AWS Toolkit for IntelliJ 설치

먼저, AWS SAM(Serverless Application Model) CLI를 설치합니다. 이 CLI는 Lambda와 유사한 실행 환경을 제공하며 단계별 코드 디버깅을 지원합니다. 또한 이 툴킷으로 SAM CLI를 사용하여 애플리케이션에 대한 배포 패키지를 구축 및 생성할 수 있습니다. 여기에서 특정 시스템용 설치 지침을 찾을 수 있습니다.

다음으로, JetBrains 플러그인 리포지토리를 통해 AWS Toolkit for IntelliJ를 설치합니다. [Settings/Preferences] 대화상자에서 [Plugins]를 클릭하고 [Marketplace]를 선택한 다음 “AWS Toolkit”을 검색하고 [Install] 버튼을 클릭합니다. 그리고 변경 내용이 적용되도록 IDE를 다시 시작합니다.

IntelliJ를 통한 서버리스 애플리케이션 구성

이제 IDE가 구성 및 준비되었으므로 새 프로젝트를 생성하고 왼쪽에서 [AWS]를 선택한 다음 [AWS Serverless Application]을 선택합니다.

다음 창에서 프로젝트 이름을 입력하고 생성을 완료합니다.

여기에서는 Maven을 사용하여 프로젝트를 관리하려고 하는데 Project Object Model(pom.xml) 파일이 루트 디렉토리에 있지 않습니다. 파일을 선택하고 오른쪽 클릭하여 Maven 프로젝트에 추가해야 합니다.

애플리케이션 배포를 시작하기 전에 오른쪽 하단 메뉴에서 AWS 리전을 선택합니다. 이 예에서는 스톡홀름을 이용합니다.

기본 애플리케이션은 Amazon API Gateway를 사용하여 HTTP를 통해 호출할 수 있는 단일 Lambda 함수로 구성됩니다. src/main/java/helloworld 디렉토리의 코드를 열고 메시지를 “Hello World from IntelliJ”로 변경합니다.

기본 애플리케이션에는 고품질 애플리케이션을 쉽게 구축할 수 있도록 해 주는 유닛 테스트가 함께 제공됩니다. 테스트가 통과할 수 있도록 assertion 코드를 수정합니다.

로컬에서 함수 실행

함수로 돌아가서 클래스 정의부 왼쪽의 Lambda 아이콘을 클릭하면 함수를 로컬에서 실행하거나 로컬 단계별 디버깅 세션을 진행할 수 있는 옵션이 표시됩니다.

여기서는 함수를 로컬에서 실행하겠습니다. 함수를 처음 실행할 때 사용할 AWS 자격 증명, 리전(함수가 사용하는 AWS 서비스용)을 설정하고 제공해야 할 입력 이벤트를 선택합니다. [API Gateway AWS Proxy]를 선택하여 API 게이트웨이의 호출을 시뮬레이션해 보겠습니다. 여기에 설명된 구문을 사용하면 HTTP 요청을 사용자 지정할 수 있습니다. 또한 환경 변수를 전달하여 함수의 동작을 사용자 지정할 수 있습니다.

[Run]을 선택하면 두 개의 탭이 표시됩니다.

  • [Build] 탭 – SAM CLI를 이용해서 빌드를 실행함
  • [Run] 탭 – 작성한 함수의 출력을 확인할 수 있음

함수의 로컬 호출은 Docker 컨테이너를 사용하여 Lambda 환경을 에뮬레이션합니다.

로컬에서 함수 디버깅

출력 메시지의 일부인 location을 이 애플리케이션이 어떻게 계산하는지 알아보기 위해 pageContents 변수에 값이 제공되는 위치에 중단점을 추가합니다. 좌측 여백 아이콘을 클릭하여 로컬에서 디버깅하는 옵션을 선택합니다.

이제 IntelliJ 디버거를 사용하여 작성한 함수에 대해 이해할 수 있게 되었습니다. [Step Into]를 클릭하여 getPageContents 메서드로 이동합니다. 여기에서 [Step Over]를 몇 번 수행하여 퍼블릭 https://checkip.amazonaws.com 웹 사이트에서 location을 어떻게 가져오는지 확인합니다.

마지막으로, 프로그램 실행을 재개하여 이전과 유사한 결과를 얻습니다.

서버리스 애플리케이션 배포

모든 것이 계획대로 작동하므로 운영환경으로 배포할 준비가 되었습니다. 원하는 AWS 리전에 서버리스 애플리케이션을 배포하겠습니다. 이를 위해 루트 디렉토리에서 template.yaml 파일을 선택합니다. 이 템플릿은 AWS SAM을 사용하여 다음 측면에서 해당 배포를 설명합니다.

  • 인프라 – 여기에서는 Lambda 함수, API, 권한 등이 해당됩니다.
  • 코드 – 함수의 Handler 속성이 소스 파일을 지정하고 Lambda 플랫폼이 호출하는 메서드를 지정하기 때문입니다.

서버리스 애플리케이션 배포를 위해 선택한 template.yaml 파일을 오른쪽 클릭합니다. AWS SAM은 AWS CloudFormation을 사용하여 필수 리소스를 생성 및 업데이트합니다. 여기에서는 새로운 AWS CloudFormation 스택을 생성하도록 선택하지만 동일한 배포 옵션을 사용하여 기존 스택을 업데이트할 수도 있습니다. 빌드 프로세스가 생성하는 배포 패키지를 호스팅할 S3 버킷을 생성합니다. 새 버킷은 자동으로 이전에 선택한 AWS 리전에 생성됩니다. 여러 배포를 위해 버킷을 재사용할 수도 있습니다. SAM CLI는 각 빌드에 대한 고유한 이름을 자동으로 생성합니다.

여기에서는 전달할 템플릿 파라미터가 없지만 SAM 또는 AWS CloudFormation에서 이를 사용하여 다른 환경을 위한 템플릿의 동작을 사용자 지정할 수 있습니다.

빌드 프로세스가 실제 Lambda 실행 환경에 의존하는 경우, 컨테이너 내에서 실행되도록 선택하여 필요한 에뮬레이션을 제공할 수 있습니다.

[Deploy]를 선택하면 몇 분 후에 AWS CloudFormation 스택이 생성됩니다.

원격으로 함수 실행

이제 Lambda 함수를 원격으로 호출할 수 있습니다. 왼쪽의 AWS Explorer에서, 선택한 리전에 대한 모든 함수가 나열된 Lambda 및 Lambda 함수를 가진 모든 스택이 나열된 AWS CloudFormation 아래에서 함수를 찾습니다.

원격으로 실행할 Lambda 함수를 오른쪽 클릭합니다. 여기에서 함수의 소스 코드로 이동할 수도 있습니다. 다시 한 번 로컬 호출에서 수행했던 것과 비슷한 방식으로 구성을 생성합니다. 즉, [API Gateway AWS Proxy] 입력 이벤트를 선택한 다음 [Run]을 선택하여 서버리스 애플리케이션의 출력을 얻습니다. 여기에서 기간, 청구 기간, 메모리 크기 및 호출이 실제로 사용한 메모리가 포함된 함수 로그도 볼 수 있습니다.

HTTP 엔드포인트 호출

HTTP를 통해 API를 호출하려면 API 엔드포인트에 대한 정보가 있어야 합니다. 이 정보는 예를 들어 다음과 같은 AWS CLI 을 이용하여 AWS CloudFormation 스택의 출력에서 얻을 수 있습니다.

$ aws cloudformation describe-stacks --stack-name hello-world-from-IntelliJ --region eu-north-1

출력 내용에는 OutputValue에 API 엔드포인트를 포함하는 다음과 유사한 섹션이 있습니다.

{
  "Description": "API Gateway endpoint URL for Prod stage for Hello World function", 
  "OutputKey": "HelloWorldApi", 
  "OutputValue": "https://<API_ID>.execute-api.eu-north-1.amazonaws.com/Prod/hello/"
}

이제 다음과 같이 curl을 사용하여 API를 호출할 수 있습니다.

$ curl -s https://<API_ID>.execute-api.eu-north-1.amazonaws.com/Prod/hello/
{
  "message": "Hello World from IntelliJ",
  "location": "x.x.x.x"
}

이 툴킷은 오픈 소스 Apache 라이선스 버전 2.0에 따라 배포됩니다. 자세한 내용은 AWS Toolkit for IntelliJ 제품 페이지를 참조하십시오.

– Danilo Poccia, AWS 서버리스 테크 에반젤리스트

이 글은 AWS Developer 블로그 AWS Toolkit for IntelliJ – Now generally available의 한국어 번역입니다.