1부: API 게이트웨이의 요청을 처리하고 서버리스 애플리케이션 모델을 사용하여 DynamoDB에 데이터를 유지하는 Lambda 함수 생성을 살펴봅니다.
2부: AWS에서 CodeCommit 리포지토리를 구성하고 리포지토리에 새로운 변경 사항이 제출되면 빌드 프로세스를 자동으로 시작하는 CICD 파이프라인을 설정하는 데 필요한 단계를 자세히 설명합니다.
AWS CLI 설치 : AWS 명령줄 인터페이스를 설치하려면 가이드를 따르세요.
AWS SAM(서버리스 애플리케이션 모델) 설치 : 지침에 따라 SAM CLI를 설치합니다.
IDE 선택 : IntelliJ 또는 유사한 IDE를 사용하여 개발하세요. 나는 IntelliJ를 선호한다
패키징을 위한 Maven : 애플리케이션 패키징을 위해 Maven이 설치되어 있는지 확인하세요.
선택 사항: Docker (Lambda 함수를 로컬에서 테스트해야 하는 경우): Lambda 함수를 로컬에서 테스트하려는 경우 Docker를 설치합니다.
환경설정
AWS 설정 :
의 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: //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: //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: //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 //aws.amazon.com/blogs/compute/optimizing-aws-lambda-function-performance-for-java/ Events: PcUsers: Type: Api # More info about API Event Source: //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 # //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 "//${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
API 테스트
API를 테스트하기 전에 SAM에서 생성된 Lambda 역할에 DynamoDB 액세스 권한을 부여합니다.
API 게이트웨이로 이동한 후 다음 단계에 따라 서비스의 URL을 얻으세요.
Content-Type: application/json
).
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
CodePipeline 생성
파이프라인 테스트
$ 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