Spacelift에서 Teleport Terraform 프로바이더 실행하기
GitOps 및 코드형 인프라를 통해 동적 구성 리소스를 관리하기 위해 Spacelift와 Teleport Terraform 프로바이더를 함께 사용할 수 있습니다. 이 가이드에서는 Spacelift에서 실행 시 머신 및 워크로드 아이덴티티를 사용하여 Teleport 클러스터에 인증하도록 Teleport Terraform 프로바이더를 구성하는 방법을 보여줍니다.
GitOps 및 코드형 인프라를 통해 동적 구성 리소스를 관리하기 위해 Spacelift와 Teleport Terraform 프로바이더를 함께 사용할 수 있습니다. 이를 통해 Teleport 구성 변경에 대한 감사 추적과 운영자가 검토할 수 있는 단일 진실의 원천을 확보할 수 있습니다.
이 가이드에서는 Spacelift에서 실행 시 머신 및 워크로드 아이덴티티를 사용하여 Teleport 클러스터에 인증하도록 Teleport Terraform 프로바이더를 구성하는 방법을 보여줍니다.
동작 방식#
이 설정에서 Teleport Terraform 프로바이더는 Spacelift가 서명한 ID 토큰을 제시하여 Teleport Auth Service에 자신의 ID를 증명합니다. 이를 통해 장기간 공유 비밀 없이 Teleport 클러스터에 인증할 수 있습니다.
이 가이드를 따르면서 Spacelift를 사용하여 동적 리소스를 생성하는 방법을 보여주기 위해 권한이 없는 Teleport 사용자와 역할을 생성합니다.
사전 요구 사항#
-
A running Teleport Enterprise cluster. If you want to get started with Teleport, sign up for a free trial or set up a demo environment.
-
The
tctlandtshclients.Installing `tctl` and `tsh` clients
-
Determine the version of your Teleport cluster. The
tctlandtshclients must be at most one major version behind your Teleport cluster version. Send a GET request to the Proxy Service at/v1/webapi/findand use a JSON query tool to obtain your cluster version. Replace with the web address of your Teleport Proxy Service:$ TELEPORT_DOMAIN= $ TELEPORT_VERSION="$(curl -s https://$TELEPORT_DOMAIN/v1/webapi/find | jq -r '.server_version')" -
Follow the instructions for your platform to install
tctlandtshclients:
-
To check that you can connect to your Teleport cluster, sign in with tsh login, then
verify that you can run tctl commands using your current credentials.
For example, run the following command, assigning to the domain name of the Teleport Proxy Service in your cluster and to your Teleport username:
$ tsh login --proxy= --user=
$ tctl status
# Cluster (=teleport.url=)
# Version (=teleport.version=)
# CA pin (=presets.ca_pin=)
If you can connect to the cluster and run the tctl status command, you can use your
current credentials to run subsequent tctl commands from your workstation.
If you host your own Teleport cluster, you can also run tctl commands on the computer that
hosts the Teleport Auth Service for full permissions.
- Terraform 구성을 저장할 GitHub 리포지토리와 해당 리포지토리에 연결된 Spacelift 스택.
- 유료 Spacelift 계정.
spacelift참여 방법을 사용하려면 이것이 필요합니다. - Teleport 사용자는 토큰 리소스를 생성할 수 있는 권한이 있어야 합니다.
1/3단계. 역할 및 머신 및 워크로드 아이덴티티 봇 생성하기#
먼저 Spacelift 작업이 사용할 머신 및 워크로드 아이덴티티 봇을 생성합니다. Teleport terraform 프로바이더가 지원하는 모든 리소스에 대한 접근 권한을 자동으로 부여하는 terraform-provider 역할을 부여합니다.
bot.yaml을 생성합니다:
kind: bot
version: v1
metadata:
# name은 클러스터에서 Bot의 고유 식별자입니다.
name: example
spec:
# terraform-provider는 terraform 프로바이더가 지원하는 모든 리소스에 대한
# 접근 권한을 부여하는 Teleport에 기본으로 포함된 역할입니다.
roles:
- terraform-provider
example을 Bot에 대한 고유하고 설명적인 이름으로 교체하세요.
tctl을 사용하여 이 파일을 적용합니다:
$ tctl create bot.yaml
2/3단계. Spacelift용 참여 토큰 생성하기#
Spacelift 스택이 Teleport 클러스터에 인증할 수 있도록 하려면 먼저 참여 토큰을 생성해야 합니다. 참여 토큰은 Teleport Auth Service가 봇 또는 노드의 클러스터 참여를 허용할지 결정하는 기준을 설정합니다.
이 예시에서는 특정 Spacelift 스택 내의 모든 실행에 접근을 허용하는 참여 토큰을 생성합니다.
bot-token.yaml이라는 파일을 생성합니다:
kind: token
version: v2
metadata:
name: example-bot
spec:
# Bot 역할은 이 토큰이 노드 참여를 허용하는 것이 아닌
# 봇 사용자에게 접근 권한을 부여함을 나타냅니다. 이 역할은 Teleport에 내장되어 있습니다.
roles: [Bot]
join_method: spacelift
# bot_name은 이 토큰이 접근 권한을 부여하는 봇 사용자를 나타냅니다.
# 이전 단계에서 생성한 봇의 이름과 일치해야 합니다.
bot_name: example
spacelift:
# hostname은 Spacelift 테넌트의 호스트명이어야 합니다.
hostname: example.app.spacelift.io
# allow는 접근이 허용될 Spacelift 실행을 제어하는 규칙을 지정합니다.
# allow 규칙과 일치하지 않는 실행은 거부됩니다.
allow:
# space_id는 모듈 또는 스택이 속한 공간을 식별합니다.
- space_id: root
# caller_type은 caller_id의 유형입니다. `stack` 또는 `module`이어야 합니다.
caller_type: stack
# caller_id는 호출자의 ID입니다. 예: 스택 또는 모듈의 이름.
caller_id: my-stack
교체할 내용:
example.app.spacelift.io를 Spacelift 테넌트의 호스트명으로 교체합니다.my-stack을 Spacelift 스택의 이름으로 교체합니다.root를 스택이 속한 공간의 ID로 교체합니다. Spacelift UI의 "Spaces" 페이지에 있는 "space details" 패널에서 ID가 표시됩니다.
리소스 파일이 작성되면 tctl로 토큰을 생성합니다:
$ tctl create -f bot-token.yaml
다음 명령으로 토큰 example-bot이 생성되었는지 확인합니다:
$ tctl tokens ls
Token Type Labels Expiry Time (UTC)
----------- ---- ------ ----------------------------------------------
example-bot Bot
3/3단계. Spacelift 스택 구성하기#
Terraform 프로바이더 구성하기#
main.tf라는 파일에 다음을 추가하여 Teleport Terraform 프로바이더를 구성하고 사용자와 역할 두 가지 동적 리소스를 선언합니다:
terraform {
required_providers {
teleport = {
source = "terraform.releases.teleport.dev/gravitational/teleport"
version = ">= (=teleport.plugin.version=)"
}
}
}
provider "teleport" {
addr = "teleport.example.com:443"
join_method = "spacelift"
join_token = "example-bot"
}
resource "teleport_role" "terraform_test" {
version = "v7"
metadata = {
name = "terraform-test"
description = "Terraform test role"
labels = {
test = "true"
}
}
}
resource "teleport_user" "terraform-test" {
metadata = {
name = "terraform-test"
description = "Terraform test user"
labels = {
test = "true"
}
}
spec = {
roles = [teleport_role.terraform_test.id]
}
}
provider 블록에서 다음을 변경합니다:
teleport.example.com:443을 Teleport 프록시 서비스의 호스트 및 HTTPS 포트로 변경합니다.example-bot을 앞서 생성한 참여 토큰의 이름으로 변경합니다.
변경 사항을 커밋하고 브랜치를 GitHub에 푸시한 다음 main 브랜치에 대한 풀 리퀘스트를 엽니다. (아직 머지하지 마세요.)
설정이 작동하는지 확인하기#
Spacelift UI에서 스택으로 이동한 다음 PRs로 이동합니다. 열었던 PR의 이름을 클릭합니다.
앞서 정의한 사용자와 역할이 포함된 Terraform 플랜이 보여야 합니다:

terraform plan을 실행할 때 Teleport Terraform 프로바이더는 머신 및 워크로드 아이덴티티를 사용하여 Teleport 클러스터에 인증하는 데 필요한 단기간 자격 증명을 생성합니다.
PR을 머지한 다음 스택으로 이동하여 Runs를 클릭합니다. PR 머지에 해당하는 첫 번째 실행의 상태를 클릭하여 실행 페이지를 방문합니다. Confirm을 클릭하여 Terraform 플랜 적용을 시작합니다.
성공을 나타내는 출력이 표시됩니다:

각 리소스에 대한 YAML 데이터를 반환해야 하는 다음 명령을 실행하여 Spacelift가 새 사용자와 역할을 생성했는지 확인합니다:
$ tctl get roles/terraform-test
$ tctl get users/terraform-test
다음 단계#
- Terraform과 Spacelift로 Teleport 구성 리소스를 관리하는 방법을 알았다면, 구성을 구체화할 수 있도록 Terraform 리소스 참조를 읽어보세요.
- Teleport 클러스터에 인증하는 데 머신 및 워크로드 아이덴티티가 사용하는 Spacelift의 OIDC 구현에 대해 자세히 알아보려면 Spacelift 문서를 읽어보세요.
