

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Java 및 Python 프로젝트를 위한 동적 CI 파이프라인을 자동으로 생성
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically"></a>

*Aromal Raj Jayarajan, Vijesh Vijayakumaran Nair, MAHESH RAGHUNANDANAN, Amarnath Reddy, Amazon Web Services*

## 요약
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-summary"></a>

이 패턴은 AWS 개발자 도구를 사용하여 Java 및 Python 프로젝트를 위한 동적 지속적 통합(CI) 파이프라인을 자동으로 생성하는 법을 보여줍니다.

기술 스택이 다양해지고 개발 활동이 증가하면 조직 전체에서 일관된 CI 파이프라인을 만들고 유지 관리하기가 어려워질 수 있습니다. AWS Step Functions에서 프로세스를 자동화하면 CI 파이프라인의 사용 및 접근 방식이 일관되도록 할 수 있습니다.

동적 CI 파이프라인 생성을 자동화하기 위해 이 패턴은 다음과 같은 변수 입력을 사용합니다.
+ 프로그래밍 언어(Java 또는 Python만 해당)
+ 파이프라인 이름
+ 필수 파이프라인 단계

**참고**  
Step Functions는 여러 AWS 서비스를 사용하여 파이프라인 생성을 오케스트레이션합니다. 이 솔루션에서 사용되는 AWS 서비스에 대한 자세한 내용은 이 패턴의 **도구** 섹션을 참조하십시오.

## 사전 조건 및 제한 사항
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ 이 솔루션이 배포되는 동일한 AWS 리전에 있는 Amazon S3 버킷
+ 이 솔루션에 필요한 리소스를 생성하는 데 필요한 AWS CloudFormation 권한을 가진 AWS Identity and Access Management(IAM) [보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)

**제한 사항 **
+ 이 패턴은 Java 및 Python 프로젝트만 지원합니다.
+ 이 패턴에 프로비저닝된 IAM 역할은 최소 권한 원칙을 따릅니다. IAM 역할의 권한은 CI 파이프라인이 생성해야 하는 특정 리소스를 기반으로 업데이트되어야 합니다.

## 아키텍처
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-architecture"></a>

**대상 기술 스택**
+ AWS CloudFormation
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS CodePipeline
+ IAM
+ Amazon Simple Storage Service(S3)
+ AWS Systems Manager
+ AWS Step Functions
+ AWS Lambda
+ Amazon DynamoDB

**대상 아키텍처·**

다음 다이어그램은 AWS 개발자 도구를 사용하여 Java 및 Python 프로젝트용 동적 CI 파이프라인을 자동으로 생성하는 예제 워크플로를 보여줍니다.

![\[AWS 도구를 사용하여 Java 및 Python 프로젝트를 위한 동적 CI 파이프라인을 자동으로 생성하는 워크플로.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/bef2ccb8-68b3-4c0f-9ee7-4b93e9422d9c/images/b5ed003f-cf16-4130-8bfb-2bc2cb9a0d33.png)


이 다이어그램은 다음 워크플로를 보여줍니다.

1. AWS 사용자는 CI 파이프라인 생성을 위한 입력 파라미터를 JSON 형식으로 제공합니다. 이 입력은 AWS 개발자 도구를 사용하여 CI 파이프라인을 생성하는 Step Functions 워크플로(*상태 머신*)를 시작합니다.

1. Lambda 함수는 Amazon S3 버킷에 저장된 **input-reference**라는 이름의 폴더를 읽은 다음 **buildspec.yml** 파일을 생성합니다. 이렇게 생성된 파일은 CI 파이프라인 단계를 정의하며 파라미터 참조를 저장하는 동일한 Amazon S3 버킷에 다시 저장됩니다.

1. Step Functions는 CI 파이프라인 생성 워크플로의 종속성에 변경 사항이 있는지 확인하고 필요에 따라 종속성 스택을 업데이트합니다.

1. Step Functions는 CodeCommit 리포지토리, CodeBuild 프로젝트, CodePipeline 파이프라인을 비롯한 CI 파이프라인 리소스를 CloudFormation 스택에 생성합니다.

1. CloudFormation 스택은 선택된 기술 스택(Java 또는 Python)의 샘플 소스 코드와 **buildspec.yml** 파일을 CodeCommit 리포지토리에 복사합니다.

1. CI 파이프라인 런타임 세부 정보는 DynamoDB 테이블에 저장됩니다.

**자동화 및 규모 조정**
+ 이 패턴은 단일 개발 환경에서만 사용할 수 있습니다. 여러 개발 환경에서 사용하려면 구성을 변경해야 합니다.
+ 한 개 이상의 CloudFormation 스택에 대한 지원을 추가하기 위해 CloudFormation 템플릿을 추가로 생성할 수 있습니다. 자세한 내용은 CloudFormation 설명서의 [AWS CloudFormation로 시작하기](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/GettingStarted.html) 항목을 참조하십시오.

## 도구
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-tools"></a>

**도구**
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)은 Lambda 함수와 기타 AWS 서비스를 결합할 수 있는 서버리스 오케스트레이션 서비스로, 비즈니스 크리티컬 애플리케이션을 구축합니다.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있도록 도와주는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html)는 소스 코드를 컴파일하고 유닛 테스트를 실행하며 배포할 준비가 완료된 아티팩트를 생성하는 완전 관리형 빌드 서비스입니다.
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html)은 나만의 소스 제어 시스템을 관리할 필요 없이 Git 리포지토리를 비공개로 저장하고 관리할 수 있는 버전 제어 서비스입니다.
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html)은 소프트웨어 릴리스의 여러 단계를 신속하게 모델링하고 구성하고 소프트웨어 변경 내용을 지속적으로 릴리스하는 데 필요한 단계를 자동화합니다.
+ [AWS Identity and Access Management(IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)는 누구에게 인증 및 사용 권한이 있는지 제어하여 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있도록 도와줍니다.
+ [AWS Key Management Service(AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)를 사용하면 암호화 키를 생성하고 제어하여 데이터를 보호할 수 있습니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)을 사용하면 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, 전체 AWS 계정 및 리전에서 수명 주기 전반에 걸쳐 관리할 수 있습니다.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)는 구성 데이터 관리 및 암호 관리를 위한 안전한 계층적 스토리지를 제공합니다.

**코드**

이 패턴의 코드는 GitHub [automated-ci-pipeline-creation](https://github.com/aws-samples/automated-ci-pipeline-creation) 리포지토리에서 사용할 수 있습니다. 리포지토리에는 이 패턴에 설명된 대상 아키텍처를 생성하는 데 필요한 CloudFormation 템플릿이 포함되어 있습니다.

## 모범 사례
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-best-practices"></a>
+ 토큰이나 암호와 같은 보안 인증(*보안 암호*)을 CloudFormation 템플릿 또는 단계 함수 작업 구성에 직접 입력하지 마십시오. 그러면 DynamoDB 로그에 정보가 표시됩니다. 대신 AWS Secrets Manager를 사용하여 보안 정보를 설정하고 저장하십시오. 그런 다음 필요에 따라 CloudFormation 템플릿 및 Step Functions 작업 구성 내에서 Secrets Manager에 저장된 보안 정보를 참조할 수 있습니다. 자세한 내용은 AWS Secrets Manager 사용 설명서의 [AWS Secrets Manager란 무엇입니까?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)를 참조하십시오.
+ Amazon S3에 저장된 CodePipeline 아티팩트에 대해 서버 측 암호화를 구성하십시오. 자세한 내용은 CodePipeline 설명서에서 [CodePipeline용 Amazon S3에 저장된 아티팩트에 대한 서버 측 암호화 구성](https://docs.aws.amazon.com/codepipeline/latest/userguide/S3-artifact-encryption.html)을 참조하십시오.
+ IAM 역할을 구성할 때 최소 권한을 적용합니다. 자세한 내용은 IAM 설명서의 [최소 권한 적용](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)을 참조하십시오.
+ Amazon S3 버킷에 공개적으로 액세스할 수 없어야 합니다. 자세한 내용은 Amazon S3 설명서의 [S3 버킷에 대한 퍼블릭 액세스 차단 설정 구성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/configuring-block-public-access-bucket.html)을 참조하십시오.
+ Amazon S3 버킷에 대한 버전 관리를 활성화해야 합니다. 자세한 내용은 Amazon S3 버킷 설명서의 [S3 버킷에서 버전 관리 사용](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)을 참조하십시오.
+ IAM 정책을 구성할 때는 IAM Access Analyzer를 사용하십시오. 이 도구는 안전하고 기능적인 IAM 정책을 작성하는 데 도움이 되는 실행 가능한 권장 사항을 제공합니다. 자세한 내용은 IAM 설명서의 [AWS Identity 및 Access Management Access Analyzer 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)을 참조하십시오.
+ 가능하면 IAM 정책을 구성할 때 특정 액세스 조건을 정의하십시오.
+ 모니터링 및 감사 목적으로 Amazon CloudWatch 로깅을 활성화하십시오. 자세한 내용은 CloudWatch 사용 설명서에서 [Amazon CloudWatch Logs란 무엇입니까?](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)를 참조하십시오.

## 에픽
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-epics"></a>

### 필수 구성 요소 구성
<a name="configure-the-prerequisites"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon S3 버킷을 생성합니다. | Amazon S3 버킷을 생성(또는 기존 버킷 사용) 하여 솔루션에 필요한 CloudFormation 템플릿, 소스 코드 및 입력 파일을 저장합니다.자세한 내용은 Amazon S3 설명서의 [1단계: 첫 S3 버킷 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html)을 참조하십시오.Amazon S3 버킷은 솔루션을 배포하는것과 동일한 AWS 리전에 있어야 합니다. | DevOps | 
| GitHub 리포지토리를 복제합니다. | 터미널 창에 다음 명령을 실행하여 GitHub [automated-ci-pipeline-creation](https://github.com/aws-samples/automated-ci-pipeline-creation) 리포지토리를 복제합니다.<pre>git clone https://github.com/aws-samples/automated-ci-pipeline-creation.git</pre>자세한 내용은 GitHub 설명서의 [리포지토리 복제](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)를 참조하십시오. | AWS DevOps | 
| 복제된 GitHub 리포지토리의 솔루션 템플릿 폴더를 Amazon S3 버킷으로 업로드합니다. | 복제된 **솔루션-템플릿** 폴더에서 콘텐츠를 복사하여 생성한 Amazon S3 버킷에 업로드합니다.자세한 내용은 Amazon S3 설명서의 [객체 업로드](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)를 참조하십시오.**Solution-Templates** 폴더의 콘텐츠만 업로드해야 합니다. Amazon S3 버킷의 루트 수준에서만 파일을 업로드할 수 있습니다. | AWS DevOps | 

### 솔루션 배포
<a name="deploy-the-solution"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 복제된 GitHub 리포지토리의 template.yml 파일을 사용하여 솔루션을 배포할 CloudFormation 스택을 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)스택이 생성되는 동안 [**스택(Stacks)**] 페이지에 **CREATE\$1IN\$1PROGRESS** 상태로 나열됩니다. 이 패턴의 나머지 단계를 완료하기 전에 스택 상태가 **CREATE\$1COMPLETE**로 변경될 때까지 기다려야 합니다. | AWS 관리자, AWS DevOps | 

### 설정 테스트
<a name="test-the-setup"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 생성한 Step Function을 실행합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)**JSON 형식**<pre>{<br />  "details": {<br />    "tech_stack": "Name of the Tech Stack (python/java)",<br />    "project_name": "Name of the Project that you want to create with",<br />    "pre_build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "post_build": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />    "reports": "Choose the step if it required in the buildspec.yml file i.e., yes/no",<br />  }<br />}</pre>**Java JSON 입력 예제**<pre>{<br />  "details": {<br />    "tech_stack": "java",<br />    "project_name": "pipeline-java-pjt",<br />    "pre_build": "yes",<br />    "build": "yes",<br />    "post_build": "yes",<br />    "reports": "yes"<br />  }<br />}</pre>**Python JSON 입력 예제**<pre>{<br />  "details": {<br />    "tech_stack": "python",<br />    "project_name": "pipeline-python-pjt",<br />    "pre_build": "yes",<br />    "build": "yes",<br />    "post_build": "yes",<br />    "reports": "yes"<br />  }<br />}</pre> | AWS 관리자, AWS DevOps | 
| CI 파이프라인의 CodeCommit 리포지토리가 생성되었는지 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| CodeBuild 프로젝트 리소스를 확인하십시오. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| CodePipeline 단계를 검증합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 
| CI 파이프라인이 성공적으로 실행되었는지 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html) | AWS DevOps | 

### 리소스 정리
<a name="clean-up-your-resources"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| CloudFormation에서 리소스 스택을 삭제합니다. | CloudFormation에서 CI 파이프라인의 리소스 스택을 삭제합니다.자세한 내용은 CloudFormation 설명서의 [AWS CloudFormation 콘솔에서 스택 삭제](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)를 참조하십시오.**<project\$1name>-stack**이라는 이름의 스택을 삭제해야 합니다. | DevOps | 
| Amazon S3와 CloudFormation에서 CI 파이프라인의 종속성을 삭제합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-dynamic-ci-pipelines-for-java-and-python-projects-automatically.html)**pipeline-creation-dependencies-stack** 이름의 스택을 삭제해야 합니다. | DevOps | 
| Amazon S3 탬플릿 버킷을 삭제하십시오. | 이 솔루션의 템플릿을 저장하는 해당 패턴의 **사전 조건 구성** 섹션에서 생성한 Amazon S3 버킷을 삭제합니다.자세한 내용은 Amazon S3 설명서의 [버킷 삭제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)를 참조하십시오. | AWS DevOps | 

## 관련 리소스
<a name="create-dynamic-ci-pipelines-for-java-and-python-projects-automatically-resources"></a>
+ [Lambda를 사용하는 Step Functions 상태 시스템 생성](https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-creating-lambda-state-machine.html)(AWS Step Functions 설명서)
+ [AWS Step Functions WorkFlow Studio](https://docs.aws.amazon.com/step-functions/latest/dg/workflow-studio.html)(AWS Step Functions 설명서)
+ [DevOps 및 AWS](https://aws.amazon.com/devops/)
+ [AWS CloudFormation 작동 방식](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html) (AWS CloudFormation 설명서)
+ [Complete CI/CD with AWS CodeCommit, AWS CodeBuild, AWS CodeDeploy, and AWS CodePipeline](https://aws.amazon.com/blogs/devops/complete-ci-cd-with-aws-codecommit-aws-codebuild-aws-codedeploy-and-aws-codepipeline/)(AWS Blog 게시물)
+ [IAM 및 AWS STS 할당량, 이름 요구 사항 및 문자 제한](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html)(IAM 설명서)