코드 리포지토리를 사용하여 AWS Service Catalog에서 Terraform 제품을 프로비저닝합니다. - AWS 권장 가이드

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

코드 리포지토리를 사용하여 AWS Service Catalog에서 Terraform 제품을 프로비저닝합니다.

작성자: Dr. Rahul Sharad Gaikwad(AWS) 및 Tamilselvan P(AWS)

환경: PoC 또는 파일럿

기술: 인프라, DevOps

워크로드: 기타 모든 워크로드

AWS 서비스: AWS 서비스 카탈로그, 아마존 EC2

요약

AWS Service Catalog는 HashiCorp Terraform 구성에 대한 거버넌스를 통해 셀프 서비스 프로비저닝을 지원합니다. Terraform을 사용하는 경우 Service Catalog를 단일 도구로 사용하여 AWS 내에서 Terraform 구성을 대규모로 구성, 관리 및 배포할 수 있습니다. 표준화되고 사전 승인된 IaC (Infrastructure as Code) 템플릿의 카탈로그 작성, 액세스 제어, 최소 권한 액세스로 클라우드 리소스 프로비저닝, 버전 관리, 수천 개의 AWS 계정과의 공유, 태깅 등 Service Catalog의 주요 기능에 액세스할 수 있습니다. 엔지니어, 데이터베이스 관리자, 데이터 과학자와 같은 최종 사용자는 액세스 권한이 있는 제품 및 버전 목록을 확인하고 한 번의 작업으로 이를 배포할 수 있습니다.

이 패턴은 Terraform 코드를 사용하여 AWS 리소스를 배포하는 데 도움이 됩니다. GitHub 리포지토리의 Terraform 코드는 Service Catalog를 통해 액세스할 수 있습니다. 이 접근 방식을 사용하면 제품을 기존 Terraform 워크플로와 통합할 수 있습니다. 관리자는 Terraform을 사용하여 Service Catalog 포트폴리오를 생성하고 AWS Launch Wizard 제품을 포트폴리오에 추가할 수 있습니다.

이 솔루션의 이점은 다음과 같습니다.

  • Service Catalog의 롤백 기능으로 인해 배포 중에 문제가 발생하는 경우 제품을 이전 버전으로 되돌릴 수 있습니다.

  • 제품 버전 간의 차이점을 쉽게 식별할 수 있습니다. 이렇게 하면 배포 중에 문제를 해결하는 데 도움이 됩니다.

  • 서비스 카탈로그에서 GitHub GitLab, 또는 CodeCommit AWS와 같은 리포지토리 연결을 구성할 수 있습니다. 리포지토리를 통해 직접 제품을 변경할 수 있습니다.

AWS Service Catalog의 전반적인 이점에 대한 자세한 내용은 서비스 카탈로그란 무엇입니까? 를 참조하십시오.

사전 조건 및 제한 사항

사전 조건

아키텍처

대상 기술 스택

  • AWS Service Catalog

  • Lambda

대상 아키텍처 

코드 리포지토리에서 Service Catalog의 Terraform 제품을 프로비저닝하는 아키텍처 다이어그램

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

  1. Terraform 구성이 준비되면 개발자는 모든 테라폼 코드가 포함된.zip 파일을 만듭니다. 개발자는.zip 파일을 Service Catalog에 연결된 코드 저장소에 업로드합니다.

  2. 관리자가 Terraform 제품을 Service Catalog의 포트폴리오에 연결합니다. 또한 관리자는 최종 사용자가 제품을 프로비저닝할 수 있도록 하는 시작 제약 조건을 생성합니다.

  3. Service Catalog에서 최종 사용자는 Terraform 구성을 사용하여 AWS 리소스를 시작합니다. 배포할 제품 버전을 선택할 수 있습니다.

도구

AWS 서비스 및 도구

  • AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

  • AWS Service Catalog를 사용하면 AWS에 승인된 IT 서비스의 카탈로그를 중앙에서 관리할 수 있습니다. 최종 사용자는 조직에서 규정한 제약에 따라, 필요에 따라 승인된 IT 서비스만 신속하게 배포할 수 있습니다.

기타 서비스

  • Go는 Google에서 지원하는 오픈소스 프로그래밍 언어입니다.

  • Python은 범용 컴퓨터 프로그래밍 언어입니다.

코드 리포지토리

Service Catalog를 통해 배포할 수 있는 샘플 Terraform 구성이 필요한 경우 Terraform을 사용한 Amazon GitHub Macie 조직 설정 리포지토리의 구성을 사용할 수 있습니다. 이 리포지토리의 코드 샘플을 사용할 필요는 없습니다.

모범 사례

  • Terraform 구성 파일 (terraform.tfvars) 에서 변수 값을 제공하는 대신 Service Catalog를 통해 제품을 시작할 때 변수 값을 구성하십시오.

  • 특정 사용자 또는 관리자에게만 포트폴리오에 대한 액세스 권한을 부여합니다.

  • 최소 권한 원칙에 따라 작업 수행에 필요한 최소 권한을 부여하십시오. 자세한 내용은 IAM 설명서의 최소 권한 부여보안 모범 사례를 참조하세요.

에픽

작업설명필요한 기술

(선택 사항) Docker를 설치합니다.

개발 환경에서 AWS Lambda 함수를 실행하려면 Docker를 설치하십시오. 자세한 내용은 도커 설명서의 도커 엔진 설치 단원을 참조하세요.

DevOps 엔지니어

테라폼용 AWS Service Catalog 엔진을 설치합니다.

  1. 다음 명령을 입력하여 Terraform용 AWS Service Catalog 엔진 리포지토리를 복제합니다.

    git clone https://github.com/aws-samples/service-catalog-engine-for-terraform-os.git
  2. 복제된 리포지토리의 루트 디렉터리로 이동합니다.

  3. 다음 명령을 입력합니다. 그러면 엔진이 설치됩니다.

    run ./bin/bash/deploy-tre.sh -r

    기본 프로필에 설정된 AWS 지역은 자동 설치 중에 사용되지 않습니다. 대신 이 명령을 실행할 때 지역을 제공합니다.

DevOps 엔지니어, AWS 관리자
작업설명필요한 기술

GitHub 리포지토리에 대한 연결을 생성합니다.

  1. AWS 관리 콘솔에 로그인한 다음 개발자 도구 콘솔을 엽니다. AWS CodePipeline, AWS 또는 AWS와 같은 서비스를 선택하여 개발자 도구 콘솔에 액세스할 수 CodeDeploy 있습니다. CodeCommit

  2. 왼쪽 탐색 창에서 [설정] 을 선택한 다음 [연결] 을 선택합니다.

  3. 연결 생성을 선택합니다.

  4. Terraform 소스 코드를 유지 관리하는 리포지토리를 선택합니다. 예를 들어, Bitbucket 또는 GitHub 엔터프라이즈 서버를 선택할 수 있습니다. GitHub

  5. 연결 이름을 입력한 다음 Connect를 선택합니다.

  6. 메시지가 표시되면 리포지토리를 인증합니다.

    인증이 완료되면 연결이 생성되고 상태가 활성으로 변경됩니다.

관리자
작업설명필요한 기술

Service Catalog 제품을 생성합니다.

  1. AWS Service Catalog 콘솔을 엽니다.

  2. 관리 섹션으로 이동한 다음 제품 목록을 선택합니다.

  3. 제품 생성을 선택합니다.

  4. 제품 세부 정보 섹션의 제품 생성 페이지에서 외부 제품 유형을 선택합니다. Service Catalog는 이 제품 유형을 사용하여 Terraform 커뮤니티 에디션 제품을 지원합니다.

  5. Service Catalog 제품의 이름과 소유자를 입력합니다.

  6. CodeStar 공급자를 사용하여 코드 리포지토리 지정을 선택합니다.

  7. 리포지토리에 대해 다음 정보를 입력합니다.

    • 다음을 사용하여 공급자에 연결 AWS CodeConnections — 이전에 생성한 연결을 선택합니다.

    • 리포지토리 - 리포지토리를 선택합니다.

    • 브랜치 — 브랜치를 선택합니다.

    • 템플릿 파일 경로 - 코드 템플릿 파일이 저장된 경로를 선택합니다. 파일 이름은 로 끝나야 tar.gz 합니다.

  8. 버전 이름 및 설명에 제품 버전에 대한 정보를 입력합니다.

  9. 제품 생성을 선택합니다.

관리자

포트폴리오를 생성합니다.

  1. AWS Service Catalog 콘솔을 엽니다.

  2. 관리 섹션으로 이동한 다음 포트폴리오를 선택하고 선택합니다.

  3. 포트폴리오 생성을 선택합니다.

  4. 다음 값을 입력합니다.

    • 포트폴리오 이름 - Sample terraform

    • 포트폴리오 설명Sample portfolio for Terraform configurations

    • 소유자 — 연락처 정보 (예: 이메일)

  5. 생성을 선택합니다.

관리자

Terraform 제품을 포트폴리오에 추가합니다.

  1. AWS Service Catalog 콘솔을 엽니다.

  2. 관리 섹션으로 이동한 다음 제품 목록을 선택합니다.

  3. 이전에 만든 Terraform 제품을 선택합니다.

  4. 작업을 선택한 다음 포트폴리오에 제품 추가를 선택합니다.

  5. Sample terraform포트폴리오를 선택합니다.

  6. 포트폴리오에 제품 추가를 선택합니다.

관리자

액세스 정책을 생성합니다.

  1. AWS 자격 증명 및 액세스 관리 (IAM) 콘솔을 엽니다.

  2. 탐색 창에서 정책을 선택합니다.

  3. 콘텐츠 창에서 정책 생성을 선택합니다.

  4. JSON 옵션을 선택합니다.

  5. 이 패턴의 추가 정보 섹션에 있는 액세스 정책에 샘플 JSON 정책을 입력합니다.

  6. 다음을 선택합니다.

  7. 검토 및 생성 페이지의 정책 이름 상자에 를 입력합니다TerraformResourceCreationAndArtifactAccessPolicy.

  8. 정책 생성을 선택합니다.

관리자

사용자 지정 신뢰 정책을 생성합니다.

  1. AWS 자격 증명 및 액세스 관리 (IAM) 콘솔을 엽니다.

  2. 탐색 창에서 역할을 선택합니다.

  3. 역할 생성을 선택합니다.

  4. 신뢰할 수 있는 개체 유형에서 사용자 지정 신뢰 정책을 선택합니다.

  5. JSON 정책 편집기에서 이 패턴의 추가 정보 섹션에 있는 신뢰 정책에 샘플 JSON 정책을 입력합니다.

  6. 다음을 선택합니다.

  7. 권한 정책에서 TerraformResourceCreationAndArtifactAccessPolicy 이전에 만든 정책을 선택합니다.

  8. 다음을 선택합니다.

  9. 역할 세부 정보의 역할 이름 상자에 을 입력합니다SCLaunch-product

    중요: 역할 이름은 로 시작해야 합니다SCLaunch.

  10. 역할 생성을 선택합니다.

관리자

Service Catalog 제품에 시작 제약 조건을 추가합니다.

  1. 관리 권한이 있는 사용자로 AWS Management 콘솔에 로그인합니다.

  2. AWS Service Catalog 콘솔을 엽니다.

  3. 탐색 창에서 포트폴리오를 선택합니다.

  4. 이전에 만든 포트폴리오를 선택합니다.

  5. 포트폴리오 세부 정보 페이지에서 제약 조건 탭을 선택한 다음 제약 조건 생성을 선택합니다.

  6. 제품의 경우 이전에 만든 Terraform 제품을 선택합니다.

  7. 시작 제약에서 방법에 대해 역할 이름 입력을 선택합니다.

  8. 역할 이름 상자에 를 입력합니다SCLaunch-product.

  9. 생성을 선택합니다.

관리자

제품에 대한 액세스 권한을 부여합니다.

  1. AWS Service Catalog 콘솔을 엽니다.

  2. 탐색 창에서 포트폴리오를 선택합니다.

  3. 이전에 만든 포트폴리오를 선택합니다.

  4. [액세스] 탭을 선택한 다음 [액세스 권한 부여] 를 선택합니다.

  5. 역할 탭을 선택한 다음 이 제품을 배포하는 데 필요한 액세스 권한을 가져야 하는 역할을 선택합니다.

  6. 액세스 권한 부여를 선택합니다.

관리자

제품을 실행합니다.

  1. Service Catalog 제품을 배포할 권한이 있는 사용자로 AWS Management 콘솔에 로그인합니다.

  2. AWS Service Catalog 콘솔을 엽니다.

  3. 탐색 창에서 제품을 선택합니다.

  4. 이전에 만든 제품을 선택한 다음 제품 출시를 선택합니다.

  5. 제품 이름을 입력하고 필수 매개변수를 정의합니다.

  6. 제품 시작을 선택합니다.

DevOps 엔지니어
작업설명필요한 기술

배포를 검증합니다.

Service Catalog 프로비저닝 워크플로를 위한 AWS Step Functions 상태 머신은 두 개 있습니다.

  • ManageProvisionedProductStateMachine—서비스 카탈로그는 새 Terraform 제품을 프로비저닝하고 기존 Terraform 프로비저닝 제품을 업데이트할 때 이 상태 시스템을 호출합니다.

  • TerminateProvisionedProductStateMachine—서비스 카탈로그는 기존 Terraform 프로비저닝 제품을 종료할 때 이 상태 시스템을 호출합니다.

ManageProvisionedProductStateMachine상태 머신의 로그를 확인하여 제품이 프로비저닝되었는지 확인합니다.

  1. AWS 관리 콘솔에 로그인한 다음 AWS Step Functions 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 스테이트 머신을 선택합니다.

  3. 선택하세요ManageProvisionedProductStateMachine.

  4. 실행 목록에서 프로비저닝된 제품 ID를 입력하여 실행을 찾습니다.

    참고: 상태 파일 백엔드 버킷 이름은 로 시작합니다. sc-terraform-engine-state-

  5. 계정에 필요한 리소스가 모두 생성되었는지 확인하세요.

DevOps 엔지니어
작업설명필요한 기술

프로비저닝된 제품을 삭제합니다.

  1. Service Catalog 제품을 배포할 권한이 있는 사용자로 AWS Management 콘솔에 로그인합니다.

  2. AWS Service Catalog 콘솔을 엽니다.

  3. 왼쪽 탐색에서 프로비저닝된 제품을 선택합니다.

  4. 생성한 제품을 선택합니다.

  5. 작업 목록에서 종료를 선택합니다.

  6. 확인 텍스트 상자에 를 입력한 terminate 다음 프로비저닝된 제품 종료를 선택합니다.

  7. 이 단계를 반복하여 프로비전된 제품을 모두 종료합니다.

DevOps 엔지니어

테라폼용 AWS Service Catalog 엔진을 제거합니다.

  1. 관리 권한이 있는 사용자로 AWS Management 콘솔에 로그인합니다.

  2. Amazon S3 콘솔을 엽니다.

  3. 탐색 창에서 버킷을 선택합니다.

  4. sc-terraform-engine-logging-XXXX버킷을 선택합니다.

  5. 비우기를 선택합니다.

  6. 다음 버킷에 대해 4~5단계를 반복합니다.

    • sc-terraform-engine-state-XXXX

    • terraform-engine-bootstrap-XXXX

  7. AWS CloudFormation 콘솔을 열고 올바른 AWS 지역에 있는지 확인합니다.

  8. 왼쪽 탐색 창에서 [Stacks] 를 선택합니다.

  9. 선택한 SAM-TRE 다음 삭제를 선택합니다. 스택이 삭제될 때까지 기다리십시오.

  10. 선택한 Bootstrap-TRE 다음 삭제를 선택합니다. 스택이 삭제될 때까지 기다리십시오.

관리자

관련 리소스

설명서

Terraform 설명서

추가 정보

액세스 정책

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "*", "Condition": { "StringEquals": { "s3:ExistingObjectTag/servicecatalog:provisioning": "true" } } }, { "Action": [ "s3:CreateBucket*", "s3:DeleteBucket*", "s3:Get*", "s3:List*", "s3:PutBucketTagging" ], "Resource": "arn:aws:s3:::*", "Effect": "Allow" }, { "Action": [ "resource-groups:CreateGroup", "resource-groups:ListGroupResources", "resource-groups:DeleteGroup", "resource-groups:Tag" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "tag:GetResources", "tag:GetTagKeys", "tag:GetTagValues", "tag:TagResources", "tag:UntagResources" ], "Resource": "*", "Effect": "Allow" } ] }

신뢰 정책

{ "Version": "2012-10-17", "Statement": [ { "Sid": "GivePermissionsToServiceCatalog", "Effect": "Allow", "Principal": { "Service": "servicecatalog.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account_id:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": [ "arn:aws:iam::accounti_id:role/TerraformEngine/TerraformExecutionRole*", "arn:aws:iam::accounti_id:role/TerraformEngine/ServiceCatalogExternalParameterParserRole*", "arn:aws:iam::accounti_id:role/TerraformEngine/ServiceCatalogTerraformOSParameterParserRole*" ] } } } ] }