

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

# GitHub Actions 및 Terragrunt를 사용하여 API 기반 리소스 오케스트레이션 프레임워크 생성
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt"></a>

*Tamilselvan P, Abhigyan Dandriyal, Sandeep Gawande, Akash Kumar, Amazon Web Services*

## 요약
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-summary"></a>

이 패턴은 GitHub Actions 워크플로를 활용하여 표준화된 JSON 페이로드를 통해 리소스 프로비저닝을 자동화하므로 수동 구성이 필요하지 않습니다. 이 자동화된 파이프라인은 전체 배포 수명 주기를 관리하고 사용자 지정 UI 구성 요소에서 ServiceNow에 이르기까지 다양한 프런트엔드 시스템과 원활하게 통합할 수 있습니다. 솔루션의 유연성을 통해 사용자는 표준화된 프로세스를 유지하면서 선호하는 인터페이스를 통해 시스템과 상호 작용할 수 있습니다.

구성 가능한 파이프라인 아키텍처는 다양한 조직 요구 사항을 충족하도록 조정할 수 있습니다. 이 구현 예는 Amazon Virtual Private Cloud(Amazon VPC) 및 Amazon Simple Storage Service(Amazon S3) 프로비저닝에 중점을 둡니다. 이 패턴은 조직 전반의 요청을 표준화하고 일관된 통합 지점을 제공하여 일반적인 클라우드 리소스 관리 문제를 효과적으로 해결합니다. 이 접근 방식을 사용하면 팀이 표준화를 보장하면서 리소스를 더 쉽게 요청하고 관리할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-prereqs"></a>

**사전 조건 **
+ 활성 AWS 계정
+ 구성된 리포지토리에 액세스할 수 있는 활성 GitHub 계정

**제한 사항 **
+ 새 리소스는 리포지토리 구성에 `terragrunt.hcl` 파일을 수동으로 추가해야 합니다.
+ 일부 AWS 서비스 는 전혀 사용할 수 없습니다 AWS 리전. 리전별 가용성은 [리전별AWS 서비스](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)를 참조하세요. 구체적인 엔드포인트는 [서비스 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)을 참조하고 서비스 링크를 선택합니다.

## 아키텍처
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-architecture"></a>

다음 다이어그램은 이 패턴의 구성 요소 및 워크플로를 보여 줍니다.

![GitHub Actions 및 Terraform을 사용하여 리소스 프로비저닝을 자동화하는 워크플로입니다.](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/bff5d70e-e8f1-454a-94bc-60e8cc16e69f/images/d4a768c8-4e11-493c-85ed-f4bf7e76ce60.png)


다이어그램은 다음 아키텍처를 보여줍니다:

1. 사용자가 GitHub Actions에 JSON 페이로드를 제출하여 자동화 파이프라인을 트리거합니다.

1. GitHub Actions 파이프라인은 페이로드 사양에 따라 Terragrunt 및 Terraform 리포지토리에서 필요한 리소스 코드를 검색합니다.

1. 파이프라인은 지정된 AWS 계정 ID를 사용하여 적절한 AWS Identity and Access Management (IAM) 역할을 수임합니다. 그런 다음 파이프라인은 리소스를 대상에 배포 AWS 계정 하고 계정별 Amazon S3 버킷 및 Amazon DynamoDB 테이블을 사용하여 Terraform 상태를 관리합니다.

각 AWS 계정 에는 보안 액세스를 위한 IAM 역할, Terraform 상태 스토리지를 위한 Amazon S3 버킷, 상태 잠금을 위한 DynamoDB 테이블이 포함되어 있습니다. 이 설계를 통해에서 제어되고 자동화된 리소스 배포가 가능합니다 AWS 계정. 배포 프로세스는 각 계정의 전용 Amazon S3 버킷 및 IAM 역할을 통해 적절한 상태 관리 및 액세스 제어를 유지합니다.

## 도구
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-tools"></a>

**AWS 서비스**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)는 빠르고 예측 가능하고 확장 가능한 성능을 제공하는 완전 관리형 NoSQL 데이터베이스 서비스입니다.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)는 AWS 리소스에 대한 액세스를 인증하고 사용할 수 있는 권한을 부여받은 사용자를 제어하여 리소스에 대한 액세스를 안전하게 관리하는 데 도움이 됩니다.
+ [Amazon Simple Storage Service(S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.
+ [Amazon Virtual Private Cloud(Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)를 사용하면 정의한 가상 네트워크에서 AWS 리소스를 시작할 수 있습니다. 이 가상 네트워크는 AWS의 확장 가능한 인프라를 사용한다는 이점과 함께 고객의 자체 데이터 센터에서 운영하는 기존 네트워크와 유사합니다.

**기타 도구**
+ [GitHub Actions](https://docs.github.com/en/actions)는 GitHub 리포지토리와 긴밀하게 통합된 지속적 통합 및 지속적 전달(CI/CD) 플랫폼입니다. GitHub Actions를 사용하여 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있습니다.
+ [Terraform](https://www.terraform.io/)은 HashiCorp의 코드형 인프라(IaC) 도구로, 클라우드 및 온프레미스 리소스를 생성하고 관리하는 데 도움이 됩니다.
+ [Terragrunt](https://terragrunt.gruntwork.io/docs/getting-started/overview/)는 OpenTofu 및 Terraform 기능을 모두 확장하는 오케스트레이션 도구입니다. 일반 인프라 패턴이 적용되는 방식을 관리하므로 대규모 인프라 자산을 더 쉽게 확장하고 유지할 수 있습니다.

**코드 리포지토리**

이 패턴의 코드는 [aws-codepipeline-terraform-cicdsamples](https://github.com/aws-samples/sample-aws-orchestration-pipeline-terraform) 리포지토리에서 사용할 수 있습니다.

## 모범 사례
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-best-practices"></a>
+ 보안 액세스를 위해 GitHub 리포지토리 보안 암호를 사용하여 AWS 자격 증명과 민감한 데이터를 저장합니다.
+ 정적 자격 증명을 사용하지 않고 IAM 역할을 수임하도록 GitHub Actions에 대한 OpenID Connect(OIDC) 공급자를 구성합니다.
+ 최소 권한 원칙을 따르고 작업을 수행하는 데 필요한 최소 권한을 부여하세요. 자세한 내용은 IAM 설명서의 [최소 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv) 및 [보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## 에픽
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-epics"></a>

### 리포지토리 생성 및 구성
<a name="create-and-configure-repository"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Git 리포지토리를 초기화합니다. | GitHub 리포지토리를 초기화하려면 다음 단계를 사용합니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt.html) | DevOps 엔지니어 | 
| IAM 역할 및 IAM 권한을 구성하려면 | IAM 역할 및 권한을 구성하려면 다음 단계를 사용합니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt.html) | DevOps 엔지니어 | 
| GitHub 시크릿 및 변수를 설정합니다. | GitHub 리포지토리에서 리포지토리 시크릿 및 변수를 설정하는 방법에 대한 지침은 GitHub 설명서의 [리포지토리에 대한 구성 변수 생성](https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-variables#creating-configuration-variables-for-a-repository)을 참조하세요. 다음 변수를 구성합니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt.html) | DevOps 엔지니어 | 
| 리포지토리 구조를 생성합니다. | 리포지토리 구조를 생성하려면 다음 단계를 사용합니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt.html) | DevOps 엔지니어 | 

### 파이프라인 트리거 및 결과 검증
<a name="trigger-the-pipeline-and-validate-results"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| curl을 사용하여 파이프라인을 실행합니다. | [curl](https://curl.se/)을 사용하여 파이프라인을 실행하려면 다음 단계를 사용합니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt.html)<br />파이프라인 실행 프로세스에 대한 자세한 내용은 [추가 정보를](#create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-additional) 참조하세요. | DevOps 엔지니어 | 
| 파이프라인 실행 결과 검증 | 결과를 검증하려면 다음 단계를 사용합니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt.html)<br />`terragrunt.hcl` 파일과 동일한 리소스 내에 있는 리포지토리에서 생성된 `output.json` 파일을 사용하여 생성된 리소스를 교차 확인할 수도 있습니다. | DevOps 엔지니어 | 

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


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 정리 요청을 제출합니다. | 더 이상 필요하지 않은 리소스를 삭제하려면 다음 단계를 사용합니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt.html) | DevOps 엔지니어 | 

## 관련 리소스
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-resources"></a>

**AWS 블로그**
+ [IAM 역할을 사용하여 GitHub 작업을의 작업에 연결 AWS](https://aws.amazon.com/blogs/security/use-iam-roles-to-connect-github-actions-to-actions-in-aws/)

**AWS 서비스 설명서**
+ [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)
+ [Amazon CloudWatch Logs를 사용하여 CloudTrail 로그 파일 모니터링](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/monitor-cloudtrail-log-files-with-cloudwatch-logs.html)
+ [Amazon S3의 보안 모범 사례](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security-best-practices.html)

GitHub 리소스 사용
+ [리포지토리 디스패치 이벤트 생성](https://docs.github.com/en/rest/repos/repos?apiVersion=2022-11-28#create-a-repository-dispatch-event)
+ [웹후크 생성](https://docs.github.com/en/webhooks/using-webhooks/creating-webhooks#payload)
+ [GitHub 리포지토리에서 강력한 액세스 제어 구현](https://docs.github.com/en/get-started/learning-about-github/access-permissions-on-github)
+ [리포지토리 액세스를 정기적으로 감사](https://docs.github.com/en/organizations/keeping-your-organization-secure/managing-security-settings-for-your-organization)
+ [CI/CD 파이프라인의 보안 검사](https://github.com/marketplace/actions/checkov-github-action)
+ [GitHub 계정에 다중 인증 사용](https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication)

## 추가 정보
<a name="create-an-api-driven-resource-orchestration-framework-using-github-actions-and-terragrunt-additional"></a>

**파이프라인 실행 프로세스**

파이프라인 실행 단계는 다음과 같습니다.

1. **JSON 페이로드 형식 검증** - 수신 JSON 구성이 올바르게 구성되고 필요한 모든 파라미터가 포함되어 있는지 확인합니다.

1. **지정된 IAM 역할 수임** - AWS 작업에 필요한 IAM 역할을 인증하고 수임합니다.

1. **필요한 Terraform 및 Terragrunt 코드 다운로드** - 지정된 버전의 리소스 코드 및 종속성을 검색합니다.

1. **리소스 배포 실행** - 구성을 적용하여 대상 환경에서 AWS 리소스를 배포하거나 업데이트합니다.

**VPC 생성에 사용되는 샘플 페이로드**

다음은 Terraform 백엔드 상태 버킷 생성을 위한 예시 코드입니다.

```
state_bucket_name = "${local.payload.ApplicationName}-${local.payload.EnvironmentId}-tfstate"
```

```
lock_table_name = "${local.payload.ApplicationName}-${local.payload.EnvironmentId}-tfstate-lock"
```

다음은 Amazon VPC를 사용하여 VPC를 생성하기 위한 예제 페이로드입니다. 여기서 `vpc_cidr`은 VPC에 대한 [CIDR 블록](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-cidr-blocks.html) 사양을 정의합니다. Terraform 상태 버킷은 `terraform` 파일에 정의된 변수에 매핑됩니다. `ref` 파라미터에는 실행할 코드의 브랜치 이름이 포함됩니다.

```
{
    "ref": "main",
    "inputs": {
        "RequestParameters": {
            "RequestId": "1111111",
            "RequestType": "create",
            "ResourceType": "vpc",
            "AccountId": "1234567890",
            "AccountAlias": "account-alias",
            "RegionId": "us-west-2",
            "ApplicationName": "myapp",
            "DivisionName": "division-name",
            "EnvironmentId": "dev",
            "Suffix": "poc"
        },
        "ResourceParameters": [
            {
                "VPC": {
                    "vpc_cidr": "10.0.0.0/16"
                }
            }
        ]
    }
}
```

`RequestParameters`는 파이프라인 섹션에서 요청 상태를 추적하는 데 사용되며이 정보를 기반으로 `tfstate` 생성됩니다. 파라미터에는 다음 정보가 포함되어 있습니다.
+ `RequestId` – 요청에 대한 고유 식별자입니다.
+ `RequestType` - 작업 유형(생성, 업데이트 또는 삭제)
+ `ResourceType` - 프로비저닝할 리소스 유형
+ `AccountId` - 배포 AWS 계정 대상
+ `AccountAlias` -의 표시 이름 AWS 계정
+ `RegionId` - 리소스 배포 AWS 리전 용
+ `ApplicationName`애플리케이션의 명칭.
+ `DivisionName` - 조직 부서
+ `EnvironmentId` – 환경(예: dev 및 prod)
+ `Suffix` - 리소스의 추가 식별자

`ResourceParameters` 에는 Terraform 파일에 정의된 변수에 매핑되는 리소스별 구성이 포함되어 있습니다. Terraform 모듈로 전달해야 하는 모든 사용자 지정 변수는에 포함되어야 합니다`ResourceParameters`. Amazon VPC의 경우 파라미터`vpc_cidr`는 필수입니다.