

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

# GitHub Actions 및 Terraform을 사용하여 Docker 이미지를 빌드하고 Amazon ECR에 푸시
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform"></a>

*Ruchika Modi, Amazon Web Services*

## 요약
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-summary"></a>

이 패턴은 재사용 가능한 GitHub 워크플로를 생성하여 Dockerfile을 빌드하고 결과 이미지를 Amazon Elastic Container Registry(Amazon ECR)로 푸시하는 방법을 설명합니다. 이 패턴은 Terraform 및 GitHub Actions를 사용하여 Dockerfiles의 빌드 프로세스를 자동화합니다. 이를 통해 인적 오류의 가능성을 최소화하고 배포 시간을 크게 줄일 수 있습니다.

GitHub 리포지토리 기본 브랜치로의 GitHub 푸시 작업을 실행하면 리소스 배포가 시작됩니다. 이 워크플로는 GitHub 조직과 리포지토리 이름의 조합을 기반으로 고유한 Amazon ECR 리포지토리를 생성합니다. 그런 다음, Dockerfile 이미지를 Amazon ECR 이미지 리포지토리로 푸시합니다.

## 사전 조건 및 제한 사항
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-prereqs"></a>

**사전 조건**
+ 활성 상태의 AWS 계정.
+ 활성 GitHub 계정
+ [GitHub 리포지토리](https://docs.github.com/en/get-started/quickstart/create-a-repo)
+ Terraform 버전 1 이상 [설치 및 구성](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli).
+ [Terraform 백엔드](https://developer.hashicorp.com/terraform/language/settings/backends/s3)의 Amazon Simple Storage Service(S3) 버킷.
+ Terraform 상태 잠금 및 일관성을 위한 [Amazon DynamoDB](https://www.googleadservices.com/pagead/aclk?sa=L&ai=DChcSEwjO95K9xqCCAxW-KIMDHfOvD7IYABADGgJzZg&gclid=EAIaIQobChMIzveSvcagggMVviiDAx3zrw-yEAAYASADEgJYWfD_BwE&ohost=www.google.com&cid=CAASJuRoKjv_llGjIU3liZ4T2IRecPqw0dVHSvjZ7bee1lvcc36K_lO_&sig=AOD64_1b294pq65HiFN-T1YxQAuXmRu_hw&adurl&ved=2ahUKEwjhiY29xqCCAxUgzjgGHRu6CAIQqyQoAnoECAkQDQ) 테이블. 이 테이블에는 유형이 `String`인 `LockID`라는 파티션 키가 있어야 합니다. 이 키가 구성되지 않은 경우 상태 잠금이 비활성화됩니다.
+ Terraform용 Amazon S3 백엔드를 설정할 수 있는 권한이 있는 AWS Identity and Access Management(IAM) 역할. 구성 지침은 [Terraform 설명서](https://developer.hashicorp.com/terraform/language/settings/backends/s3#assume-role-configuration)를 참조하세요.

**제한 사항**

이 재사용 가능한 코드는 GitHub Actions에서만 테스트되었습니다.

## 아키텍처
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-architecture"></a>

**대상 기술 스택**
+ Amazon ECR 리포지토리
+ GitHub Actions
+ Terraform

**대상 아키텍처 **

![워크플로 - 재사용 가능한 GitHub 워크플로를 생성하여 Dockerfile을 빌드하고 이미지를 Amazon ECR로 푸시합니다.](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/c39c110e-cbe5-459e-a0aa-de27e884fb10/images/298e0e16-3054-49b7-8695-db510e0df2df.png)


다이어그램은 다음을 보여 줍니다.

1. 사용자가 GitHub 리포지토리에 Dockerfile 및 Terraform 템플릿을 추가합니다.

2. 템플릿을 추가하면 GitHub 작업 워크플로가 시작됩니다.

3. 이 워크플로는 Amazon ECR 리포지토리가 존재하는지 확인합니다. 이 리포지토리가 없으면 GitHub 조직 및 리포지토리 이름을 기반으로 리포지토리를 생성합니다.

4. 이 워크플로는 Dockerfile을 빌드하고 이미지를 Amazon ECR 리포지토리로 푸시합니다.

## 도구
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-tools"></a>

**Amazon 서비스**
+ [Amazon Elastic Container Registry(Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)는 안전하고 확장성이 있고 신뢰할 수 있는 관리형 컨테이너 레지스트리 서비스입니다.

**기타 도구**
+ [GitHub Actions](https://docs.github.com/en/actions)는 GitHub 플랫폼에 통합되어 GitHub 리포지토리 내에서 워크플로를 생성, 공유 및 실행하도록 지원합니다. GitHub Actions를 사용하여 코드 빌드, 테스트 및 배포와 같은 작업을 자동화할 수 있습니다.
+ [Terraform](https://developer.hashicorp.com/terraform/intro)은 HashiCorp의 코드형 인프라(IaC) 도구로, 클라우드 및 온프레미스 인프라를 생성하고 관리하는 데 도움이 됩니다.

**코드 리포지토리**

이 패턴의 코드는 GitHub [Docker ECR 작업 워크플로](https://github.com/aws-samples/docker-ecr-actions-workflow) 리포지토리에서 사용할 수 있습니다.
+ GitHub 작업을 생성하면 Docker 워크플로 파일이 이 리포지토리의 `/.github/workflows/` 폴더에 저장됩니다. 이 솔루션의 워크플로는 [workflow.yaml](https://github.com/aws-samples/docker-ecr-actions-workflow/blob/main/.github/workflows/workflow.yaml) 파일에 있습니다.
+ `e2e-test` 폴더는 참조 및 테스트를 위한 샘플 Dockerfile을 제공합니다.

## 모범 사례
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-best-practices"></a>
+ Dockerfiles 작성 모범 사례는 [Docker 설명서](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)를 참조하세요.
+ [Amazon S3용 VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html)를 사용합니다. VPC 엔드포인트는 프라이빗 IP 주소를 통해 Amazon ECR API에 비공개로 액세스할 수 있는 기술인 AWS PrivateLink로 구동됩니다. Fargate 시작 유형을 사용하는 Amazon ECS 작업의 경우, 작업에 퍼블릭 ID 주소를 할당할 필요 없이 Amazon ECR에서 프라이빗 이미지를 가져오는 작업이 가능합니다.

## 에픽
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-epics"></a>

### OIDC 공급자 및 GitHub 리포지토리 설정
<a name="set-up-the-oidc-provider-and-github-repository"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| OpenID Connect를 구성합니다. | OpenID Connect(OIDC) 공급자를 생성합니다. 이 작업에 사용되는 IAM 역할에 대한 신뢰 정책에 있는 공급자를 사용합니다. 지침은 GitHub 설명서의 [Amazon Web Services에서 OpenID Connect 구성](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)을 참조하세요. | AWS 관리자, AWS DevOps, 일반 AWS | 
| GitHub 리포지토리를 복제합니다. | GitHub [Docker ECR 작업 워크플로](https://github.com/aws-samples/docker-ecr-actions-workflow) 리포지토리를 로컬 폴더에 복제합니다.<pre>$git clone https://github.com/aws-samples/docker-ecr-actions-workflow</pre> | DevOps 엔지니어 | 

### GitHub 재사용 가능 워크플로 사용자 지정 및 Docker 이미지 배포
<a name="customize-the-github-reusable-workflow-and-deploy-the-docker-image"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Docker 워크플로를 시작하는 이벤트를 사용자 지정합니다. | 이 솔루션의 워크플로는 [workflow.yaml](https://github.com/aws-samples/docker-ecr-actions-workflow/blob/main/.github/workflows/workflow.yaml)에 있습니다. 이 스크립트는 현재 `workflow_dispatch` 이벤트를 수신할 때 리소스를 배포하도록 구성되어 있습니다. 이벤트를 `workflow_call`로 변경하고 다른 상위 워크플로에서 워크플로를 호출하여 이 구성을 사용자 지정할 수 있습니다. | DevOps 엔지니어 | 
| 워크플로를 사용자 지정합니다. | [workflow.yaml](https://github.com/aws-samples/docker-ecr-actions-workflow/blob/main/.github/workflows/workflow.yaml) 파일은 재사용 가능한 동적 GitHub 워크플로를 생성하도록 구성됩니다. 이 파일을 편집하여 기본 구성을 사용자 지정하거나, `workflow_dispatch` 이벤트를 사용하여 수동으로 배포를 시작하는 경우 GitHub Actions 콘솔에서 입력 값을 전달할 수 있습니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform.html) | DevOps 엔지니어 | 
| Terraform 템플릿을 배포합니다. | 이 워크플로는 구성한 GitHub 이벤트에 따라 Amazon ECR 리포지토리를 생성하는 Terraform 템플릿을 자동으로 배포합니다. 이 템플릿은 [Github 리포지토리의 루트](https://github.com/aws-samples/docker-ecr-actions-workflow/tree/main)에서 `.tf` 파일로 사용할 수 있습니다. | AWS DevOps, DevOps 엔지니어 | 

## 문제 해결
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-troubleshooting"></a>


| 문제 | Solution | 
| --- | --- | 
| Amazon S3 및 DynamoDB를 Terraform 원격 백엔드로 구성할 때 발생하는 문제 또는 오류. | [Terraform 설명서](https://developer.hashicorp.com/terraform/language/settings/backends/s3)의 지침에 따라 원격 백엔드 구성에 필요한 Amazon S3 및 DynamoDB 리소스 권한을 설정합니다. | 
| `workflow_dispatch` 이벤트로 워크플로를 실행하거나 시작할 수 없습니다. | `workflow_dispatch` 이벤트에서 배포하도록 구성된 워크플로는 해당 워크플로가 기본 브랜치에도 구성된 경우에만 작동합니다. | 

## 관련 리소스
<a name="build-and-push-docker-images-to-amazon-ecr-using-github-actions-and-terraform-resources"></a>
+ [워크플로 재사용](https://docs.github.com/en/actions/using-workflows/reusing-workflows)(GitHub 설명서)
+ [워크플로 트리거](https://docs.github.com/en/actions/using-workflows/triggering-a-workflow)(GitHub 설명서)