인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!
CI 또는 클라우드에서 Teleport Terraform Provider 실행
이 가이드는 다음에서 Teleport Terraform Provider를 실행하는 방법을 다룹니다:
- 다음의 CI/CD 파이프라인에서:
- GitHub Actions (우리는
github
조인 메서드를 사용할 것입니다) - GitlabCI (우리는
gitlab
조인 메서드를 사용할 것입니다) - CircleCI (우리는
circleci
조인 메서드를 사용할 것입니다)
- GitHub Actions (우리는
- 다음의 클라우드 VM에서:
- AWS (우리는
aws
조인 메서드를 사용할 것입니다) - GCP (우리는
gcp
조인 메서드를 사용할 것입니다)
- AWS (우리는
Note
네이티브 MachineID로 Terraform provider를 실행하는 것은 Azure, Kubernetes pod 내, 및 신뢰할 수 있는 플랫폼 모듈 (TPM)이 있는 서버에서 지원됩니다. 이 가이드에서는 이러한 설정에 대한 자세한 내용을 설명하지 않지만, 정규 MachineID 가이드를 따르고 "Configure tbot
" 단계를 조인 메서드와 토큰을 제공하는 것으로 대체할 수 있습니다.
HCP Terraform (Terraform Cloud) 및 자체 호스팅 Terraform Enterprise는 지원되지만 특별한 구성이 필요하므로 우리의 전용 가이드를 참조하십시오.
이 가이드는 Teleport를 로컬, 전용 서버 또는 특정 플랫폼에서 실행하는 방법을 다루지 않습니다. 이러한 경우에는 다음의 보다 구체적인 가이드를 참조하십시오:
- Terraform Provider 로컬에서 실행
- 서버에서 Teleport Terraform Provider 실행
- Spacelift에서 Teleport Terraform Provider 실행
작동 원리
이 setup은 런타임(즉, CI/CD 시스템, 클라우드 공급자, 컨테이너 엔진 등)에 신원 증명을 요청합니다. 이 증명은 Terraform provider에 의해 Teleport에 연결하고 자격 증명을 얻는 데 직접 사용됩니다. 이 setup에서는 tbot
데몬이 포함되지 않으며, Terraform provider가 네이티브로 신원 증명을 얻고 Teleport 클러스터에 조인할 수 있습니다.
이 setup은 Teleport가 위임된 조인 메서드를 제공하는 선택된 런타임에 대해서만 작동합니다 (예: GitHub Actions, GitLab CI 등).
전제 조건
다음 중 하나가 필요합니다:
- terraform이 설치된 GCP 또는 AWS VM
- GitHub Actions, GitLab CI 또는 CircleCI 작업을 실행할 수 있는 git 저장소
또한 필요합니다:
-
실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.
-
tctl
관리자 도구와tsh
클라이언트 도구.tctl
및tsh
다운로드 방법에 대한 지침은 설치를 방문하십시오.
1/4 단계. Terraform provider 봇 생성
이 단계에서는 terraform
이라는 봇을 생성합니다.
terraform-bot.yaml
이라는 파일을 생성합니다:
kind: bot
version: v1
metadata:
name: terraform
spec:
# terraform-provider는 Teleport에 포함된 기본 역할로, terraform provider가 지원하는 모든 리소스에 대한 접근을 부여합니다.
roles: ["terraform-provider"]
그런 다음 tctl
로 적용합니다:
tctl create terraform-bot.yaml
이것은 관리자 수준의 작업이며, 완료를 위해 MFA가 필요합니다.보안 키를 탭하세요.보안 키 탭 감지됨.봇 "terraform"이 생성되었습니다.
이 시점에서, 새로운 봇을 확인할 수 있습니다:
tctl bots ls
Bot User Roles--------- ------------- ------------------terraform bot-terraform terraform-provider
2/4단계. 봇 조인 토큰 생성
이 단계에서는 이전에 생성한 terraform
봇으로 Teleport에 연결할 수 있는 토큰을 생성합니다.
토큰 유형 및 구성은 Terraform 제공자가 실행되는 위치에 따라 다릅니다. 조인 프로세스, 다양한 조인 방법, 토큰 유형 및 지원하는 필드에 대한 자세한 내용은 조인 참조를 참조하십시오.
Terraform Provider가 organization/repository의 GitHub Actions 워크플로우에서 조인할 수 있도록 하려면 다음 terraform-bot-token.yaml
을 생성하십시오:
kind: token
version: v2
metadata:
name: terraform-bot
spec:
roles: [Bot]
join_method: github
bot_name: terraform
github:
# allow는 어떤 GitHub Actions 실행이
# 접근을 허용받게 되는지를 제어하는 규칙을 지정합니다.
# 어떤 allow 규칙과도 일치하지 않는 것은 거부됩니다.
allow:
- repository: organization/repository
Terraform Provider가 group/project의 GitLab CI 파이프라인에서 조인할 수 있도록 하려면
gitlab.example.com GitLab 인스턴스에서 다음 terraform-bot-token.yaml
을 생성하십시오:
kind: token
version: v2
metadata:
name: terraform-bot
spec:
roles: [Bot]
join_method: gitlab
bot_name: terraform
gitlab:
# domain은 GitLab 인스턴스의 도메인이어야 합니다.
# GitLab의 클라우드 호스팅 서비스를 사용하는 경우, 이 필드를 완전히 생략하십시오.
domain: gitlab.example.com
# allow는 Teleport가 수락할 GitLab 토큰을 제어하는 규칙을 지정합니다.
# 어떤 allow 규칙과도 일치하지 않는 토큰은 거부됩니다.
allow:
- project_path: group/project
Teleport 클러스터에 연결할 수 있는 CircleCI 워크플로우 규칙을 구성하려면, CircleCI 조직의 ID를 결정하고 CircleCI 컨텍스트를 만들어야 합니다.
조직 ID 찾기
CircleCI를 열고 내비게이션 바에서 "조직 설정"으로 이동합니다.
"개요"라는 제목의 인터페이스가 표시되고 "조직 ID"라는 섹션이 보일 것입니다. 이 값을 기록해 두고 구성 예제에서 organization-id를 이 값으로 대체하십시오.
컨텍스트 만들기
CircleCI에는 컨텍스트라는 조직 수준의 개념이 있습니다. 이는 워크플로우 작업에 노출되어야 하는 일련의 비밀을 구성할 수 있게 해줍니다. CircleCI를 구성하여 컨텍스트와 연결된 작업을 트리거할 수 있는 액터를 제어할 수 있습니다.
워크플로우 작업에 할당된 컨텍스트는 CircleCI가 작업을 위해 생성하는 ID 토큰에 인코딩됩니다. 이는 Teleport가 어떤 CircleCI 작업이 Teleport 클러스터에 대한 액세스를 부여받아야 하는지를 결정하는 이상적인 방법입니다.
이 예제에서는 teleport-access
라는 이름의 CircleCI 컨텍스트를 만들 것입니다. 그런 다음 이 컨텍스트에 Teleport 클러스터에 대한 액세스를 부여합니다.
CircleCI에서 컨텍스트를 만들기 위해 "조직 설정"을 열고 "컨텍스트"로 이동합니다. "컨텍스트 생성"을 클릭하고 만들고자 하는 컨텍스트의 이름으로 teleport-access를 제공하십시오. 조직에 더 적합한 문자열로 이 값을 대체할 수 있지만, 이 가이드의 향후 단계에서 teleport-access를 여러분의 값으로 교체해야 합니다.
방금 생성한 컨텍스트를 선택합니다. 이제 컨텍스트를 구성할 수 있는 페이지로 이동합니다. Teleport를 구성하는 데 사용할 컨텍스트의 ID를 찾기 위해, 컨텍스트 설정 페이지의 URL을 확인합니다. 이 URL은 다음과 유사한 형식을 가질 것입니다:
https://app.circleci.com/settings/organization/github/gravitational/contexts/00000000-0000-0000-0000-000000000000
이 경우, 컨텍스트 ID는: 00000000-0000-0000-0000-000000000000
입니다.
이 값을 기록해 두고 구성 예제에서 context-id를 이 값으로 대체하십시오.
그런 다음, 다음 terraform-bot-token.yaml
을 생성하십시오:
kind: token
version: v2
metadata:
name: terraform-bot
spec:
roles: [Bot]
join_method: circleci
bot_name: terraform
circleci:
organization_id: organization-id
# allow는 Auth 서버가 `tbot` 의 조인을 허용해야 하는 규칙을 정의합니다.
allow:
- context_id: context-id
다음 사항을 확인하십시오:
- Teleport 클러스터에 접근을 허용할 AWS IAM 역할. 이 역할은
sts:GetCallerIdentity
가 부여되어야 합니다. 이 가이드에서는 이 역할을 instance-iam-role라고 명명합니다. - Terraform 제공자를 실행할 IAM 역할이 연결된 AWS EC2 가상 머신.
- AWS 계정 ID: 111111111111
그런 다음, 다음 terraform-bot-token.yaml
을 생성하십시오:
kind: token
version: v2
metadata:
name: terraform-bot
spec:
roles: [Bot]
bot_name: terraform
join_method: iam
allow:
- aws_account: "111111111111"
aws_arn: "arn:aws:sts::organization-id:assumed-role/instance-iam-role/i-*"
다음 사항을 확인하십시오:
- 제공자를 실행할 VM에 연결된 GCP 서비스 계정(SA). 이는 기본 컴퓨팅 SA일 수 없습니다. 이 가이드에서는 이 SA를 my-service-account라고 명명합니다.
- GCP 프로젝트 ID: my-project-123456
그런 다음, 다음 terraform-bot-token.yaml
을 생성하십시오:
kind: token
version: v2
metadata:
name: terraform-bot
spec:
roles: [Bot]
bot_name: terraform
join_method: gcp
gcp:
allow:
- project_ids:
- "my-project-123456"
service_accounts:
- "my-service-account@my-project-123456.iam.gserviceaccount.com"
terraform-bot-token.yaml
매니페스트에 설명된 봇 토큰을 생성하십시오:
tctl create -f terraform-bot-token.yaml
이것은 관리자 수준의 작업이며 완료하려면 MFA가 필요합니다모든 보안 키를 탭하세요보안 키 탭 감지됨provision_token "terraform-bot"이 생성되었습니다
3/4단계. Terraform 공급자 구성
이 단계에서는 Teleport 클러스터에 연결하고 이전에 생성한 토큰으로 조인하는 공급자를 구성하기 위한 최소한의 Terraform 코드를 작성합니다.
이를 위해 필요한 사항:
- 포트를 포함한 Teleport 클러스터 도메인: teleport.example.com:443. 이는 웹 UI에 접근할 때 URL에서 찾을 수 있습니다.
- 생성한 토큰의 조인 방법. 이는
terraform-bot-token.yaml
의spec.join_method
필드입니다: token-join-method.
이 최소한의 main.tf
파일을 생성합니다:
terraform { required_providers { teleport = { source = "terraform.releases.teleport.dev/gravitational/teleport" version = "~> 17.0" } }}
provider "teleport" { addr = "teleport.example.com:443" join_method = "token-join-method" join_token = "terraform-bot"}테스트 역할을 생성해야 합니다. 리소스를 선언하지 않으면 Terraform은
Teleport에 연결을 시도하지 않으며 설정을 검증할 수 없습니다.
resource "teleport_role" "test" { version = "v7" metadata = { name = "test" description = "Terraform 공급자 설정을 검증하기 위한 더미 역할" labels = { test = "yes" } }
spec = {}}
GitHub Actions 파이프라인을 실행하는 GitHub 저장소에 main.tf
파일을
복사합니다.
GitLab CI 파이프라인을 실행하는 GitLab 저장소에 main.tf
파일을 복사합니다.
CircleCI 파이프라인을 실행하는 Git 저장소에 main.tf
파일을 복사합니다.
Terraform을 실행할 EC2 인스턴스에 main.tf
파일을 복사합니다.
Terraform을 실행할 GCP VM에 main.tf
파일을 복사합니다.
4/4단계. Terraform 실행
이 단계에서는 환경에 따라 Terraform을 실행하는 최소한의 예제를 보여줍니다. 이 코드는 생산 환경에 적합하지 않은 기본 로컬 백엔드를 사용합니다. 특히 CI에서는 Terraform 상태가 CI 파이프라인 간에 지속되도록 비로컬 Terraform 백엔드를 사용해야 합니다.
Terraform 코드가 포함된 저장소에서 다음 내용을 가진 .github/workflows/teleport-terraform.yaml
파일을 생성합니다:
name: Teleport Terraform 데모
# 시작하는 데 도움이 되는 기본 워크플로입니다.
# "main" 브랜치에 푸시할 때마다 다음 작업을 수행합니다.
on:
push:
branches:
- main
jobs:
demo:
permissions:
# "id-token: write" 권한이 필요합니다. 그렇지 않으면 기계 ID가 클러스터와 인증할 수 없습니다.
id-token: write
contents: read
name: terraform-plan
runs-on: ubuntu-latest
# 더 고급 TF 워크플로에 대한 정보는 https://github.com/hashicorp/setup-terraform 에서 확인할 수 있습니다.
steps:
- uses: actions/checkout@v4
- uses: hashicorp/setup-terraform@v3
- name: Terraform Init
id: init
run: terraform init
- name: Terraform Plan
id: plan
run: terraform plan -no-color
변경 사항을 커밋하고 main
브랜치에 푸시하여 GitHub Actions 워크플로를 트리거합니다.
워크플로 로그에서 Terraform 계획이 성공적으로 실행되는 것을 확인할 수 있습니다.
클러스터 이름을 복구합니다:
tctl status
Cluster teleport.example.comVersion 16.2.0...
Terraform 코드가 포함된 저장소에서 .gitlab-ci.yaml
파일을 생성(존재하지 않는 경우)하고 다음 내용을 추가합니다:
stages:
- plan
image:
name: hashicorp/terraform:1.9
entrypoint: [""]
terraform-job:
stage: plan
# id_tokens는 GitLab이 자동으로 GitLab 실행 환경에 주입하는 ID 토큰을 구성합니다.
#
# id_tokens 구성에 대한 자세한 설명은 https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html에서 확인할 수 있습니다.
id_tokens:
TBOT_GITLAB_JWT:
# TBOT_GITLAB_JWT의 aud는 Teleport 클러스터의 이름으로 구성되어야 합니다.
# 이는 반드시 Teleport 클러스터의 주소일 필요는 없으며 포트나 스킴(http/https)를 포함하지 않습니다.
#
# 이는 Teleport Auth 서버가 토큰이 자신을 위한 것이고 다른 서비스나 Teleport 클러스터 용이 아님을 알리는 데 도움이 됩니다.
aud: "teleport.example.com"
script:
- terraform init
- terraform plan
변경 사항을 커밋하고 임의의 브랜치에 푸시하여 GitLab CI 파이프라인을 트리거합니다. 파이프라인 로그에서 Terraform 계획이 성공적으로 실행되는 것을 확인할 수 있습니다.
Terraform 코드가 포함된 저장소에서 .circleci/config.yml
에 다음 CircleCI 구성을 추가합니다:
version: '2.1'
orbs:
terraform: circleci/terraform@3.1
workflows:
deploy_infrastructure:
jobs:
- terraform/init:
tag: 1.9.5
checkout: true
context: teleport-access
- terraform/plan:
tag: 1.9.5
context: teleport-access
requires:
- terraform/init
변경 사항을 커밋하고 임의의 브랜치에 푸시하여 CircleCI 파이프라인을 트리거합니다. 파이프라인 로그에서 Terraform 계획이 성공적으로 실행되는 것을 확인할 수 있습니다.
EC2 인스턴스에서 Terraform 명령을 실행합니다:
terraform init백엔드 초기화 중...
플러그인 공급자 초기화 중...- terraform.releases.teleport.dev/gravitational/teleport 버전 찾는 중 ...terraform planTerraform은 선택한 공급자를 사용하여 다음 실행 계획을 생성했습니다. 리소스 작업은 다음 기호로 표시됩니다: + 생성
Terraform은 다음 작업을 수행할 것입니다:
# teleport_role.test가 생성됩니다 + resource "teleport_role" "test" { + id = (적용 후 알 수 있음) + kind = (적용 후 알 수 있음) + metadata = { + name = "test" + namespace = (적용 후 알 수 있음) } + spec = {} + version = "v7" }
계획: 1 추가, 0 변경, 0 삭제.
GCP VM에서 Terraform 명령을 실행합니다:
terraform init백엔드 초기화 중...
플러그인 공급자 초기화 중...- terraform.releases.teleport.dev/gravitational/teleport 버전 찾는 중 ...terraform planTerraform은 선택한 공급자를 사용하여 다음 실행 계획을 생성했습니다. 리소스 작업은 다음 기호로 표시됩니다: + 생성
Terraform은 다음 작업을 수행할 것입니다:
# teleport_role.test가 생성됩니다 + resource "teleport_role" "test" { + id = (적용 후 알 수 있음) + kind = (적용 후 알 수 있음) + metadata = { + name = "test" + namespace = (적용 후 알 수 있음) } + spec = {} + version = "v7" }
계획: 1 추가, 0 변경, 0 삭제.