paint-brush
AWS 서버리스 API 및 CICD 파이프라인 구축 가이드~에 의해@pchandel09
6,521 판독값
6,521 판독값

AWS 서버리스 API 및 CICD 파이프라인 구축 가이드

~에 의해 Puneet Chandel11m2023/10/27
Read on Terminal Reader

너무 오래; 읽다

이 문서에서는 AWS 서비스를 활용하는 서버리스 API 개발을 보여주고 AWS 환경 내에서 CICD(지속적 통합/지속적 배포) 파이프라인을 설정합니다.
featured image - AWS 서버리스 API 및 CICD 파이프라인 구축 가이드
Puneet Chandel HackerNoon profile picture


개요

이 문서에서는 AWS 서비스를 활용하는 서버리스 API 개발을 보여주고 AWS 환경 내에서 CICD(지속적 통합/지속적 배포) 파이프라인을 설정합니다.


1부: API 게이트웨이의 요청을 처리하고 서버리스 애플리케이션 모델을 사용하여 DynamoDB에 데이터를 유지하는 Lambda 함수 생성을 살펴봅니다.


2부: AWS에서 CodeCommit 리포지토리를 구성하고 리포지토리에 새로운 변경 사항이 제출되면 빌드 프로세스를 자동으로 시작하는 CICD 파이프라인을 설정하는 데 필요한 단계를 자세히 설명합니다.

전제조건

이 프로젝트에는 AWS 계정이 필요합니다(프리 티어이면 충분합니다). 다음 AWS 구성 요소가 활용됩니다.


  • AWS API 게이트웨이
  • AWS 람다
  • AWS 다이나모DB
  • AWS 코드커밋
  • AWS 코드빌드
  • AWS 코드파이프라인
  • AWS S3
  • 기타 - CloudWatch, IAM 등


로컬 개발 환경이 다음과 같이 설정되어 있는지 확인하세요.


  1. AWS CLI 설치 : AWS 명령줄 인터페이스를 설치하려면 여기 가이드를 따르세요.


  2. AWS SAM(서버리스 애플리케이션 모델) 설치 : 여기 지침에 따라 SAM CLI를 설치합니다.


  3. IDE 선택 : IntelliJ 또는 유사한 IDE를 사용하여 개발하세요. 나는 IntelliJ를 선호한다


  4. 패키징을 위한 Maven : 애플리케이션 패키징을 위해 Maven이 설치되어 있는지 확인하세요.


  5. 선택 사항: Docker (Lambda 함수를 로컬에서 테스트해야 하는 경우): Lambda 함수를 로컬에서 테스트하려는 경우 Docker를 설치합니다.


이러한 도구와 구성 요소는 프로젝트의 기초를 형성합니다.

1부: 개발

이 섹션에서는 핸들러 클래스 완료, AWS 구축, 배포, Postman을 사용한 테스트 수행 등 AWS SAM을 사용하여 시작 프로젝트를 생성하는 과정을 살펴보겠습니다.


환경설정

  1. AWS 설정 :

    https://aws.amazon.com/console/ 의 AWS 콘솔로 이동하여 관리자 자격 증명을 사용하여 로그인합니다.

    1. IAM에서 사용자 생성 :
      • IAM에서 로컬 개발 및 CLI/SAM 사용을 전담하는 사용자를 생성합니다.
    2. DynamoDB 테이블 생성 :
      • 이름: "users", 기본 키: "id" (유형: 문자열)
  2. 로컬 머신에서 AWS CLI 구성 :

    • 터미널을 열고 $ aws configure 실행하세요.
    • 이전에 생성한 IAM 사용자에 대한 액세스 키와 기타 기본값을 제공합니다.
  3. AWS Serverless Application Model(SAM)을 사용하여 프로젝트 초기화 :

    • 터미널을 열고 $ sam init 실행하세요.
    • AWS 빠른 시작 템플릿을 선택합니다.
    • "Hello World" 예제를 선택하세요.
    • Java 11 또는 17을 선택하고 패키지 유형을 zip으로 선택하고 Maven을 종속성 관리자로 사용합니다.
    • CloudWatch 및 XRay를 사용하여 로깅 및 모니터링을 활성화합니다.
  4. 프로젝트 이름 바꾸기 : 프로젝트 이름을 원하는 이름으로 바꿉니다.

  5. IntelliJ에서 프로젝트 열기 : IntelliJ를 실행하고 프로젝트를 엽니다.

  6. 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 액세스 권한을 부여합니다.

  • AWS 콘솔에서 Lambda 함수를 엽니다.


  • "권한"으로 이동하여 역할 이름을 찾으세요.


  • 이 역할에 "DynamoDBFullAccess" 권한을 추가합니다.


이 단계에서는 Lambda 함수에 DynamoDB와 상호 작용하는 데 필요한 권한이 있는지 확인합니다.




API 게이트웨이로 이동한 후 다음 단계에 따라 서비스의 URL을 얻으세요.

  1. AWS 콘솔에서 API 게이트웨이로 이동합니다.

  2. API를 선택하세요.

  3. 왼쪽 사이드바에서 '단계'를 클릭합니다.

  4. '단계'에서 'Prod' 단계를 선택합니다.

  5. 단계 편집기 섹션에서 "호출 URL"을 찾을 수 있습니다. 이 URL을 복사하세요.



  • Postman 애플리케이션을 실행합니다.
  • POST 요청 생성: 다음 세부 정보로 새 요청을 설정합니다.
    • 방법: POST
    • URL: 앞서 얻은 API Gateway 엔드포인트 URL을 붙여넣습니다.
  • 헤더 설정: 필요한 헤더를 추가합니다(예: Content-Type: application/json ).


  • 요청 본문 추가: 요청으로 보내려는 사용자 데이터를 나타내는 JSON 개체를 만듭니다. 이는 DynamoDB에 저장될 것으로 예상되는 데이터입니다.


2부 CICD 파이프라인 구현

이 섹션에서는 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 프로젝트를 설정합니다. 여기에는 빌드 환경, 빌드 명령 및 종속성 정의가 포함됩니다.


  • 빌드 파일을 저장할 S3 버킷을 생성합니다.


  • AWS Code Build를 검색하고, 새 프로젝트를 생성하고, CodeCommit을 코드 소스로, S3를 아티팩트 스토리지로 제공합니다.


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 생성

  • AWS CodePipeline에서 새 파이프라인을 생성합니다.


  • 파이프라인을 CodeCommit 리포지토리에 소스로 연결합니다.


  • CodeBuild를 빌드 단계로 사용하도록 파이프라인을 구성합니다.


  • 생성한 템플릿을 사용하여 CloudFormation을 트리거하는 배포 단계를 추가합니다.


파이프라인은 git 커밋을 기반으로 코드를 자동으로 빌드하고 배포합니다.



파이프라인 테스트


  • IntelliJ에서 프로젝트를 엽니다.


  • 파일 중 하나를 약간 변경합니다. 예를 들어 다른 로거 라인을 추가합니다.


  • 로컬 Git 저장소에 변경 사항을 커밋합니다.


  • CodeCommit 리포지토리에 커밋을 푸시합니다.


 $ 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
  • AWS CodePipeline 콘솔로 이동합니다.


  • 파이프라인이 자동으로 시작되는 것을 볼 수 있습니다. 리포지토리에서 최신 코드를 가져와 CodeBuild를 사용하여 프로젝트를 빌드하고 CloudFormation을 사용하여 배포합니다.


  • CodePipeline 대시보드에서 진행 상황을 모니터링하세요.


이렇게 하면 코드를 변경하고 이를 리포지토리에 푸시하며 CICD 파이프라인이 업데이트된 코드를 자동으로 트리거 및 배포하는 프로세스를 시뮬레이션합니다.







































이 기사에서는 AWS API Gateway, Lambda, DynamoDB, CodeCommit, CodeBuild 및 CodePipeline을 활용하여 탄력적이고 자동화된 배포 프로세스를 설계하는 방법을 보여줍니다.


읽어 주셔서 감사합니다. 귀하의 서버리스 노력이 성공과 혁신을 이루기를 바랍니다!