IT/Infra&Cloud

[aws] Service Catalog - Terraform Engine

Hayley Shim 2023. 10. 30. 00:07

안녕하세요. Control Tower 내 Account Factory 기능을 활용하여 Service Catalog 제품을 프로비저닝하며 최근 적용된 제품 유형인 Terraform Engine에 대해 좀 더 깊게(Deep Dive) 알아보고자 작성한 글입니다.

 

2023년 4월 3일부터 AWS Service Catalog에서 AWS CloudFormation을 사용하는 것 외에도 Hashicorp Terraform을 사용하여 코드형 인프라(IaC) 리소스를 정의할 수 있습니다. [참고]

 

Service Catalog를 사용할 때 Terraform 템플릿에 대한 Service Catalog 제품을 생성한 다음 여러 제품을 Service Catalog 포트폴리오로 통합할 수 있는 옵션이 있습니다. 

AWS Service Catalog 제공 제품 유형

 

위와 같이 Cloudformation 외 Terraform 관련 유형으로 Terraform Open Source, Terraform Cloud, External 이 있고 현재 Terraform Open Source 경우 23년 12월 14일까지 지원되고 14일 이후에는 Open Source 제품과 프로비저닝된 제품을 External 제품 유형으로 마이그레이션하도록 권장하고 있습니다.

[참고 -Note on migration from TERRAFORM_OPEN_SOURCE to EXTERNAL product types ] [외부 제품 유형으로 업데이트]

  1. 외부 및 Terraform 오픈 소스 제품 유형에 대한 지원을 모두 AWS Service Catalog 포함하도록 기존 Terraform 참조 엔진을 업데이트하십시오. Terraform 참조 엔진 업데이트에 대한 지침은 리포지토리를 검토하세요. GitHub 
  2. 새 외부 제품 유형을 사용하여 기존 Terraform 오픈 소스 제품을 모두 다시 만드세요.
  3. Terraform 오픈 소스 제품 유형을 사용하는 기존 제품을 모두 삭제하십시오.
  4. 새 외부 제품 유형을 사용하여 해당 리소스를 다시 프로비저닝하십시오.
  5. Terraform 오픈 소스 제품 유형을 사용하는 기존의 프로비저닝된 제품을 모두 종료하십시오.

모든 새 제품 및 출시된 프로비저닝 리소스는 외부(External) 제품 유형을 참조해야 합니다.

 

우선 Service Catalog Docs 내에 테라폼 제품을 시작하는 방법을 참고하여 각 유형별 필요한 테라폼 엔진에 대해 알아보겠습니다. 

 

1. 테라폼 오픈 소스 프로비저닝 엔진 구성

HashiCorp Terraform 오픈 소스 제품을 만들기 전에 관리자 계정 (허브 계정) 에서 AWS Service Catalog Terraform 프로비저닝 엔진을 설치하고 구성해야 합니다. AWS가 엔진과 해당 리소스를 관리합니다. 

 

AWS 중국 블로그를 참고하여 서비스 카탈로그와 Terraform Reference Engine을 통한 제품 생성 과정은 다음과 같습니다.

서비스 카탈로그 내 Terraform Engine을 통한 제품 생성 과정

 

위와 같이 Terraform Reference Engine을 통해 Terraform Open Source 엔진이 설치된 Terraform admin account(Hub account)에서 제품 생성을 할 수 있습니다. 

 

아래는 Terraform Reference Engine이 설치된 계정인 Terraform admin account(Hub account) 에서 진행되는 절차입니다.

 

Terraform 참조 엔진 프로젝트 아키텍처

 

 

  1. 사용자가 Terraform 제품에 대한 배포 요청을 시작합니다
  2. 요청은 ServiceCatalogTerraformOSProvisionOperationQueue로 이동합니다.
  3. Lambda 함수 TerraformEngineProvisioningHandlerLambda는 대기열에서 이 요청을 사용하여 배포 프로세스를 담당하는 Step Functions 상태 머신을 트리거합니다
  4. 상태 머신은 Lambda 함수 SelectWorkerHostFunction을 트리거하여 Terraform Auto-Scaling 그룹에서 사용 가능한 인스턴스를 반환하려고 시도합니다
  5. 이전 단계가 성공하면 상태 머신은 Lambda 함수 SendApplyCommandFunction을 계속 트리거하여 terraform_runner 명령을 생성하고 이전 단계에서 반환된 인스턴스에서 SSM을 통해 명령을 실행합니다. terraform 인스턴스는 배포 계정에서 Launch 역할을 맡습니다
  6. Terraform 인스턴스는 리소스 배포를 수행합니다
  7. 상태 머신은 배포 결과를 기다렸다가 Lambda 함수 PollCommandInvocationFunction, GetStateFileOutputsFunction을 실행하여 결과를 가져온 다음 Lambda 함수 NotifyProvisionResult를 실행하여 Service Catalog에 후속 작업을 알립니다
  8. Service Catalog 서비스의 Launch Role은 배포 계정을 가정합니다
  9. Service Catalog는 새로 생성된 리소스를 새 리소스 그룹에 조인합니다
  10. Resource 그룹은 새로 만든 리소스에 태그를 연결하는 작업을 담당합니다

 

 

Terraform 참조 엔진 배포 구성은 다음 자료를 참고했습니다. [참고 - 깃헙]

 

1. Pre-requisites : 설치는 모든 Linux 또는 Mac 컴퓨터에서 할 수 있고 이번 테스트에서는 AWS에 Amazon Linux(t3.medium) 인스턴스를 설치하였고 관련 툴(AWS SAM CLI, Docker, AWS CLI, Go, Python)을 설치해줍니다.

 

2. Install the Terraform Reference Engine : 깃헙을 잘 참고하여 환경 설정, Code Build를 해주고 AWS Account에 Deploy 를 해줍니다.

- Bootstrap.yaml 템플릿을 사용하여 Cloudformation 스택을 생성해줍니다.

 

 

Bootstrap Cloudformation 스택 배포

 

- 아래와 같이 Terraform Reference Engine(테라폼 참조 엔진)이 배포되면 별도의 instance가 생성됩니다.

Terraform Engine가 설치된 인스턴스

 

3. Terraform Reference Engine(테라폼 참조 엔진)이 배포된 계정에서 Service Catalog Product을 생성해줍니다. 아래 그림과 같이 Terraform Open Source와 External 제품 유형 경우 모두 Terraform Open Source 엔진을 사용하기 때문에 아래와 같이 생성해주었습니다. [참고-테라폼 구성 파일 다운로드] [참고-테라폼 제품 만들기

Service Catalog 내 제품 목록(Terraform Open Source, External 유형)

 

이후 [참고-포트폴리오 생성] [참고-포트폴리오에 제품 추가] 를 참고하여 포트폴리오를 생성하고 위에 만든 제품을 추가해줍니다.

Service Catalog 내 포트폴리오 생성

 

 

4. 이 단계에서는 최종 사용자가 HashiCorp Terraform 오픈 소스 또는 Terraform Cloud 제품을 시작할 때 Terraform 프로비저닝 엔진과 AWS Service Catalog가 가정할 수 있는 권한을 지정하는 IAM 역할(시작 역할)을 생성합니다. [참고 - 시작 역할 생성

- 테라폼 제품에 필요한 정책, 역할 등을 생성해줍니다.

 

5. 테라폼 제품에 시작 제약(Launch constraint}) 추가해줍니다. [참고-시작 제약 추가]

제약 조건 추가

 

6. 최종 사용자의 액세스 권한을 부여해줍니다. [참고-최종 사용자 액세스 권한 부여]

사용자 액세스 추가

 

7. 최종으로 포트폴리오를 공유할 사용자를 선택해줍니다. [참고- 최종 사용자와 포트폴리오 공유]

포트폴리오 공유

 

 

8. Terraform Reference 엔진이 있는 계정의 Service Catalog에서 생성해준 제품 목록을 최종 사용자의 계정에서 Control Tower의 Account Factory 내 Customization 옵션에서 선택해줍니다. 아래는 Open Source 유형으로 생성해준 제품을 등록하여 제품을 생성한 경우입니다. 

Control Tower Account Factory 내 Service Catalog 제품(Terraform Open Source 유형) 등록 화면

 

- 현재 Open Source 유형으로는 Control Tower 의 Account Factory Customization 기능을 통해 계정 및 리소스 생성이 정상적으로 되었고 External 유형으로는 이슈가 있어 깃헙에 문의 중입니다[이슈 참고]

- AWS 문의 결과, ControlTower의 EXTERNAL 타입 지원은 11월말 적용 예정으로 안내받았습니다. 실제 Hashicorp 라이선스 변경이 2023년 12월 14일에 이뤄지게 되어 ControlTower 서비스팀에서는 External 타입 지원을 그전까지 지원할 예정이라고 합니다.

- 참고로 기존 'Verbose cannot be true for Product type EXTERNAL'은 'The specified product type is not supported' 라고 에러문구가 변경되었습니다. 

 

 

2. 테라폼 클라우드 프로비저닝 엔진 구성

마찬가지로 AWS Service Catalog에서 HashiCorp Terraform Cloud 제품을 생성하기 전에 AWS Service Catalog 관리자 계정(허브 계정)에서 Terraform 프로비저닝 엔진을 구성해야 합니다. [참고 - https://github.com/hashicorp/aws-service-catalog-engine-for-tfc ]

 

Terraform Cloud용 AWS 서비스 카탈로그 엔진(TFC-RE)은 사용자가 TFC를 사용하여 서비스 카탈로그 제품을 프로비저닝할 수 있도록 하는 AWS Service Catalog와 Terraform Cloud 간의 통합입니다. 

 

아래와 같이 Terraform Cloud/Enterprise 와 CSP 간의 인증은 Terraform Agent 를 통해 이뤄집니다. 아래 HashiCorp 솔루션 엔지니어 Andy Assareh 의 그림을 참고했습니다. [참고]

Terraform Agent를 통한 자격 증명 관리

 

마찬가지로 Terraform Cloud 제품 유형을 사용하여 Service Catalog 내 제품을 생성해줍니다.

Service Catalog 내 제품 목록(Terraform Cloud)

 

Terraform Cloud 유형으로도 Control Tower의 Account Factory Customization 기능을 통해 계정 및 리소스 생성이 정상적으로 되었습니다.

 

참고로 폐쇄망에서 Terraform 사용을 위해 Provider를 직접 받아 사용할 수 있어 관심있는 분들은 terraform cli가 실행되는 환경에서 provider들을 bundle로 묶은 상태에서 배포해보는 방법도 시도해보시기 바랍니다. [참고]

 

 

참고 자료

1. Control Tower
https://catalog.workshops.aws/control-tower/en-US

2.AFT
https://developer.hashicorp.com/terraform/tutorials/aws/aws-control-tower-aft

3.AFC
https://docs.aws.amazon.com/ko_kr/controltower/latest/userguide/af-customization-page.html

4.Service catalog
https://docs.aws.amazon.com/ko_kr/servicecatalog/latest/adminguide/productmgmt-cloudresource.html

5.Service catalog terraform engine
https://aws.amazon.com/cn/blogs/china/deploying-terraform-reference-engine-for-aws-service-catalog-service

6.Terraform cloud key management
https://www.hashicorp.com/blog/managing-credentials-in-terraform-cloud-and-enterprise

 

AWS Control Tower Workshop

AWS Control Tower Workshop Studio

catalog.workshops.aws

 

'IT > Infra&Cloud' 카테고리의 다른 글

[aws] Organization policy - backup  (0) 2023.11.25
[aws] Service Catalog - cloudformation  (0) 2023.11.03
[gcp] Cloud ID로 조직 생성&테라폼 배포  (0) 2023.10.30
[aws] Control Tower  (0) 2023.10.30
[aws] EKS Automation  (0) 2023.10.30