이 문서에서는 AWS 서비스를 활용하는 서버리스 API 개발을 보여주고 AWS 환경 내에서 CICD(지속적 통합/지속적 배포) 파이프라인을 설정합니다.
1부: API 게이트웨이의 요청을 처리하고 서버리스 애플리케이션 모델을 사용하여 DynamoDB에 데이터를 유지하는 Lambda 함수 생성을 살펴봅니다.
2부: AWS에서 CodeCommit 리포지토리를 구성하고 리포지토리에 새로운 변경 사항이 제출되면 빌드 프로세스를 자동으로 시작하는 CICD 파이프라인을 설정하는 데 필요한 단계를 자세히 설명합니다.
이 프로젝트에는 AWS 계정이 필요합니다(프리 티어이면 충분합니다). 다음 AWS 구성 요소가 활용됩니다.
로컬 개발 환경이 다음과 같이 설정되어 있는지 확인하세요.
AWS CLI 설치 : AWS 명령줄 인터페이스를 설치하려면 여기 가이드를 따르세요.
AWS SAM(서버리스 애플리케이션 모델) 설치 : 여기 지침에 따라 SAM CLI를 설치합니다.
IDE 선택 : IntelliJ 또는 유사한 IDE를 사용하여 개발하세요. 나는 IntelliJ를 선호한다
패키징을 위한 Maven : 애플리케이션 패키징을 위해 Maven이 설치되어 있는지 확인하세요.
선택 사항: Docker (Lambda 함수를 로컬에서 테스트해야 하는 경우): Lambda 함수를 로컬에서 테스트하려는 경우 Docker를 설치합니다.
이러한 도구와 구성 요소는 프로젝트의 기초를 형성합니다.
이 섹션에서는 핸들러 클래스 완료, AWS 구축, 배포, Postman을 사용한 테스트 수행 등 AWS SAM을 사용하여 시작 프로젝트를 생성하는 과정을 살펴보겠습니다.
환경설정
AWS 설정 :
https://aws.amazon.com/console/ 의 AWS 콘솔로 이동하여 관리자 자격 증명을 사용하여 로그인합니다.
로컬 머신에서 AWS CLI 구성 :
$ aws configure
실행하세요.AWS Serverless Application Model(SAM)을 사용하여 프로젝트 초기화 :
$ sam init
실행하세요.프로젝트 이름 바꾸기 : 프로젝트 이름을 원하는 이름으로 바꿉니다.
IntelliJ에서 프로젝트 열기 : IntelliJ를 실행하고 프로젝트를 엽니다.
pom.xml에 종속성을 추가합니다 .
pom.xml
파일에 필요한 종속성을 추가합니다. 다른 종속성은 SAM에 자동으로 포함되므로 DynamoDB만 추가하면 됩니다.
<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-dynamodb</artifactId> <version>1.12.573</version> </dependency> </dependencies>
핸들러 클래스 작성
람다 함수의 경우 sam이 자동으로 생성한 핸들러 클래스를 편집하고 다음 코드를 추가합니다. 이는 간단한 코드이며 실제 프로젝트의 경우 더 모듈화된 코드를 사용하는 것이 좋습니다.
public class UserRequestHandler implements RequestHandler<Map<String,String>, Map<String,String>> { private AmazonDynamoDB amazonDynamoDB; private String DYNAMODB_TABLE_NAME = "users"; private Regions REGION = Regions.US_EAST_1; @Override public Map<String,String> handleRequest(Map<String,String> input, Context context) { this.initDynamoDbClient(); LambdaLogger logger = context.getLogger(); logger.log("Input payload:" + input.toString()); String userId = UUID.randomUUID().toString(); String firstName= input.get("firstName"); String lastName= input.get("lastName"); Map<String, AttributeValue> attributesMap = new HashMap<>(); attributesMap.put("id", new AttributeValue(userId)); attributesMap.put("firstName", new AttributeValue(firstName)); attributesMap.put("lastName", new AttributeValue(lastName)); logger.log(attributesMap.toString()); amazonDynamoDB.putItem(DYNAMODB_TABLE_NAME, attributesMap); Map<String, String> response = new HashMap<>(); response.put("id", userId); response.put("firstName", firstName); response.put("lastName", lastName); return response; } private void initDynamoDbClient() { this.amazonDynamoDB = AmazonDynamoDBClientBuilder.standard() .withRegion(REGION) .build(); } }
SAM 템플릿 파일 업데이트
SAM 템플릿 파일은 AWS에 변경 사항을 구축하고 배포하는 데 중추적인 역할을 합니다. 프로젝트 파일을 업데이트합니다. 이 파일 내에서 집중해야 할 핵심 요소는 Lambda 함수 이름과 API 게이트웨이 엔드포인트입니다. 이는 서버리스 애플리케이션 기능의 핵심입니다.
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > pc-aws-user-api Sample SAM Template for pc-aws-user-api # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 20 MemorySize: 128 Tracing: Active Api: TracingEnabled: true Resources: UserRequestHandlerLambdaFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: PcAwsUsersApi Handler: com.pc.aws.users.UserRequestHandler::handleRequest Runtime: java11 Architectures: - x86_64 MemorySize: 512 Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object Variables: PARAM1: VALUE JAVA_TOOL_OPTIONS: -XX:+TieredCompilation -XX:TieredStopAtLevel=1 # More info about tiered compilation https://aws.amazon.com/blogs/compute/optimizing-aws-lambda-function-performance-for-java/ Events: PcUsers: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /users Method: post ApplicationResourceGroup: Type: AWS::ResourceGroups::Group Properties: Name: Fn::Sub: ApplicationInsights-SAM-${AWS::StackName} ResourceQuery: Type: CLOUDFORMATION_STACK_1_0 ApplicationInsightsMonitoring: Type: AWS::ApplicationInsights::Application Properties: ResourceGroupName: Ref: ApplicationResourceGroup AutoConfigurationEnabled: 'true' Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api PcAwsUsersApi: Description: API Gateway endpoint URL for Prod stage Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/users/" UserRequestHandlerLambdaFunction: Description: Lambda Function ARN Value: !GetAtt UserRequestHandlerLambdaFunction.Arn UserRequestHandlerLambdaFunctionIamRole: Description: Implicit IAM Role created Value: !GetAtt UserRequestHandlerLambdaFunctionRole.Arn
SAM을 사용하여 코드 빌드 및 배포
IntelliJ에서 터미널을 열고 다음 명령을 실행합니다.
$ sam build
$ sam deploy –guided
메시지가 표시되면 스택 이름을 "PcAwsUsersApi"로 제공하고 기본 옵션을 선택합니다.
출력에는 생성된 CloudFormation 스택이 표시되며 API 게이트웨이 엔드포인트도 제공됩니다.
API 테스트
API를 테스트하기 전에 SAM에서 생성된 Lambda 역할에 DynamoDB 액세스 권한을 부여합니다.
이 단계에서는 Lambda 함수에 DynamoDB와 상호 작용하는 데 필요한 권한이 있는지 확인합니다.
API 게이트웨이로 이동한 후 다음 단계에 따라 서비스의 URL을 얻으세요.
AWS 콘솔에서 API 게이트웨이로 이동합니다.
API를 선택하세요.
왼쪽 사이드바에서 '단계'를 클릭합니다.
'단계'에서 'Prod' 단계를 선택합니다.
단계 편집기 섹션에서 "호출 URL"을 찾을 수 있습니다. 이 URL을 복사하세요.
Content-Type: application/json
).
이 섹션에서는 AWS CodeCommit, CodeBuild 및 CodePipeline을 사용하여 CICD 파이프라인을 구축하는 방법을 보여줍니다. 파이프라인은 저장소에서 코드를 가져오고, 빌드 파일을 사용하여 코드를 빌드하고, CloudFormation을 트리거하여 스택을 생성하는 빌드 프로세스를 시작합니다.
CodeCommit 리포지토리 생성
AWS에 로그인하고 CodeCommit 서비스를 검색하세요.
프로젝트의 소스 코드를 저장할 AWS CodeCommit에 새 리포지토리를 생성합니다.
리포지토리에 코드 커밋
IntelliJ에서 터미널을 열고 다음 명령을 입력하여 I단계에서 생성된 코드를 커밋합니다.
$ git init → This initialize local git $ git add . → This will stage files $ git commit -m "commit to CodeCommit"
원격 Repo에 변경 사항 푸시
AWS 콘솔에서 CodeCommit 저장소 URL을 복사합니다.
$ git remote add origin <repo URL> $ git push --set-upstream origin master --> This will prompt for user/password
AWS CodeBuild 프로젝트 생성
애플리케이션 빌드 방법을 지정하는 CodeBuild 프로젝트를 설정합니다. 여기에는 빌드 환경, 빌드 명령 및 종속성 정의가 포함됩니다.
CodeBuild를 설정하려면 프로젝트 디렉터리에 buildspec.yml
이라는 빌드 사양 파일을 생성해야 합니다. 이 파일에는 CodeBuild에 대한 빌드 명령과 지침이 포함됩니다.
buildspec.yml
파일 생성에 대한 자세한 지침은 여기에서 공식 문서를 참조할 수 있습니다.
version: 0.2 phases: install: runtime-versions: java: corretto11 pre_build: commands: - echo Nothing to do in the pre_build phase... build: commands: - echo Build started on `date` - sam build - sam package --output-template-file pcoutputtemplate.yaml --s3-bucket com-appsdev-pc-001 post_build: commands: - echo Build completed on `date` artifacts: files: - pcoutputtemplate.yaml
새 파일을 로컬에서 저장소로 푸시합니다.
그런 다음 프로젝트를 빌드하여 코드가 Repo에서 풀링되고 아티팩트가 빌드되는지 확인할 수 있습니다.
CodePipeline 생성
파이프라인은 git 커밋을 기반으로 코드를 자동으로 빌드하고 배포합니다.
파이프라인 테스트
$ git branch CR01 $ git checkout CR01 $ git add . $ git commit -m “CR01” $ git push --set-upstream origin CR01 You cand also create a pull request in aws code commit, just for simplicity I am merging from local $ git checkout master $ git merge --ff-only CR01 $ git push
이렇게 하면 코드를 변경하고 이를 리포지토리에 푸시하며 CICD 파이프라인이 업데이트된 코드를 자동으로 트리거 및 배포하는 프로세스를 시뮬레이션합니다.
이 기사에서는 AWS API Gateway, Lambda, DynamoDB, CodeCommit, CodeBuild 및 CodePipeline을 활용하여 탄력적이고 자동화된 배포 프로세스를 설계하는 방법을 보여줍니다.
읽어 주셔서 감사합니다. 귀하의 서버리스 노력이 성공과 혁신을 이루기를 바랍니다!