Infograb logo
Spacelift에서 Teleport Terraform Provider 실행

Spacelift와 Teleport Terraform provider를 사용하여 GitOps 및 코드로서의 인프라를 통해 동적 구성 리소스를 관리할 수 있습니다. 이를 통해 Teleport 구성의 변경 사항에 대한 감사 추적을 얻고 운영자가 검토할 수 있는 단일 진실 소스를 제공합니다.

이 가이드는 Spacelift 스택에서 실행 중인 Teleport Terraform provider가 Teleport 클러스터를 구성할 수 있도록 Machine ID 에이전트인 tbot 을 사용하는 방법을 보여줍니다.

이 설정에서 tbot 은 Spacelift에 의해 서명된 ID 토큰을 제시하여 Teleport Auth Service에 자신의 신원을 증명합니다. 이를 통해 tbot 은 장기적으로 공유 비밀 없이 Teleport 클러스터에 인증할 수 있습니다.

이 가이드를 따라 하면서 Privileged가 없는 Teleport 사용자 및 역할을 생성하여 Spacelift를 사용하여 동적 리소스를 생성하는 방법을 보여줄 것입니다.

전제 조건

  • 실행 중인 Teleport 클러스터. Teleport를 시작하려면 가입하여 무료 평가판을 이용해 보십시오.

  • tctl 관리자 도구 및 tsh 클라이언트 도구.

    tctltsh 다운로드에 대한 지침은 설치 를 방문하십시오.

  • 연결이 가능한지 확인하기 위해 tsh login 으로 로그인한 다음, 현재 자격 증명을 사용하여 tctl 명령어를 실행할 수 있는지 확인하십시오. 예를 들어:
    tsh login --proxy=teleport.example.com --user=email@example.com
    tctl status

    클러스터 teleport.example.com

    버전 17.0.0-dev

    CA 핀 sha256:abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678abdc1245efgh5678

    클러스터에 연결할 수 있고 tctl status 명령어를 실행할 수 있다면, 현재 자격 증명을 사용하여 워크스테이션에서 후속 tctl 명령어를 실행할 수 있습니다.
    자신의 Teleport 클러스터를 호스팅하는 경우, Teleport Auth Service를 호스팅하는 컴퓨터에서 전체 권한으로 tctl 명령어를 실행할 수도 있습니다.
  • Terraform 구성을 저장할 GitHub 리포지토리와 이 리포지토리에 연결된 Spacelift 스택이 필요합니다.
  • 유료 Spacelift 계정이 필요합니다. 이는 spacelift 조인 방법을 사용하기 위해 필요합니다.
  • 귀하의 Teleport 사용자는 토큰 리소스를 생성할 수 있는 권한을 가져야 합니다.

1/3단계. 역할 및 Machine ID 봇 생성

우선 Spacelift 작업을 수행할 Machine ID 봇을 생성합니다. terraform-provider 역할을 부여할 것이며, 이는 Teleport terraform provider가 지원하는 모든 리소스에 대한 액세스를 자동으로 부여합니다.

bot.yaml 을 생성합니다:

kind: bot
version: v1
metadata:
  # name은 클러스터 내에서 Bot의 고유 식별자입니다.
  name: example
spec:
  # terraform-provider는 Teleport와 함께 제공되는 기본 역할로,
  # terraform provider가 지원하는 모든 리소스에 대한 액세스를 부여합니다.
  roles:
    - terraform-provider

example 을 고유하고 설명적인 봇 이름으로 교체해야 합니다.

다음 명령어를 사용하여 이 파일을 적용합니다:

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:
      # 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 create -f bot-token.yaml

다음 명령어를 사용하여 example-bot 토큰이 생성되었는지 확인합니다:

tctl tokens ls
Token Type Labels Expiry Time (UTC)----------- ---- ------ ----------------------------------------------example-bot Bot

3/3단계. Spacelift 스택 구성

이 단계를 따라가면서, git 리포지토리를 수정하여:

  • Spacelift를 구성하여 Machine ID로 생성된 자격 증명을 사용하여 Teleport Terraform 프로바이더를 봇 사용자로 인증합니다.
  • git 리포지토리를 사용하여 동적인 Teleport 리소스를 생성합니다.

계속하기 전에, GitHub 리포지토리를 클론합니다. 클론한 후, 메인 브랜치에서 브랜치를 체크아웃합니다.

Spacelift를 봇 사용자로 인증하도록 구성하기

봇이 성공적으로 생성되었으므로, 이제 이 봇을 사용하여 tbot 으로 인증하도록 Spacelift 스택을 구성해야 하며, 그 후 tbot 에서 생성된 자격 증명을 사용하는 Terraform 프로바이더를 구성해야 합니다.

이를 돕기 위해 Teleport는 커스텀 Spacelift 컨테이너 이미지를 보내줍니다. 이 이미지는 Spacelift에서 제공하는 기본 이미지를 기반으로 하며, 추가로 tbot 이 포함되어 있습니다.

Spacelift 스택에 연결된 리포지토리 내에서 .spacelift/config.yaml 파일을 생성하여 teleport-spacelift-runner 이미지를 지정하고, tbot 을 호출하여 자격 증명을 생성하는 before_init 단계를 포함합니다:

version: "1"
stack_defaults:
  runner_image: public.ecr.aws/gravitational/teleport-spacelift-runner:17.0.0-dev
  before_init:
    - |-
      tbot start --oneshot \
        --data-dir=memory:// \
        --proxy-server teleport.example.com:443 \
        --join-method spacelift \
        --token example-bot \
        --destination-dir=/mnt/workspace/tbot-output

다음 내용을 교체합니다:

  • teleport.example.com:443 를 Teleport 클러스터의 주소로 변경합니다.
  • example-bot 을 첫 번째 단계에서 생성한 토큰의 이름으로 변경합니다.
하나의 리포지토리에서 여러 스택을 사용하고 있나요?

하나의 리포지토리 내에 여러 Spacelift 스택이 있는 경우, stack_defaults 를 사용하면 이 구성이 리포지토리 내의 모든 스택에 적용된다는 점을 주의해야 합니다.

이를 피하기 위해, 특정 스택을 구성하기 위해 stack_defaults 대신 stacks 키를 사용할 수 있습니다. 자세한 내용은 Spacelift 런타임 구성 문서를 참고하세요.

구성 리소스 선언

main.tf 라는 파일에 다음 내용을 추가하여 Teleport Terraform 프로바이더를 구성하고 사용자 및 역할이라는 두 개의 동적 리소스를 선언합니다:

terraform {
  required_providers {
    teleport = {
      source  = "terraform.releases.teleport.dev/gravitational/teleport"
      version = ">= 13.3.7"
    }
  }
}

provider "teleport" {
  addr               = "teleport.example.com:443"
  identity_file_path = "/mnt/workspace/tbot-output/identity"
}

resource "teleport_role" "terraform_test" {
  version = "v7"
  metadata = {
    name        = "terraform-test"
    description = "Terraform 테스트 역할"
    labels = {
      test = "true"
    }
  }
}

resource "teleport_user" "terraform-test" {
  metadata = {
    name        = "terraform-test"
    description = "Terraform 테스트 사용자"

    labels = {
      test = "true"
    }
  }

  spec = {
    roles = [teleport_role.terraform_test.id]
  }
}

provider 블록 내에서 teleport.example.com:443 를 Teleport 프록시 서비스의 호스트 및 HTTPS 포트로 변경합니다.

변경 사항을 커밋하고 브랜치를 GitHub에 푸시한 후, main 브랜치에 대해 풀 리퀘스트를 엽니다. (아직 병합하지 마십시오.)

설정이 작동하는지 확인

Spacelift UI에서 스택으로 이동한 다음 PRs로 이동합니다. 열린 PR의 이름을 클릭합니다.

이전에 정의한 사용자와 역할이 포함된 Terraform 계획을 확인할 수 있어야 합니다:

terraform plan 을 실행할 때 Spacelift는 tbot 에 의해 생성된 아이덴티티 파일을 사용하여 Teleport에 인증합니다.

PR을 병합한 다음 스택으로 이동하여 Runs를 클릭합니다. PR 병합에 해당하는 첫 번째 실행의 상태를 클릭하여 실행 페이지로 이동합니다. Terraform 계획을 적용하기 시작하려면 Confirm 을 클릭합니다.

성공을 나타내는 출력을 볼 수 있어야 합니다:

다음 명령을 실행하여 Spacelift가 새로운 사용자와 역할을 생성했는지 확인합니다. 각 리소스에 대한 YAML 데이터를 반환해야 합니다:

tctl get roles/terraform-test
tctl get users/terraform-test

다음 단계

  • Terraform과 Spacelift로 Teleport 구성 리소스를 관리하는 방법을 알았으므로 Terraform 리소스 참고 자료를 읽어 구성을 보완하십시오.
  • Teleport 클러스터에 인증하기 위해 머신 ID가 사용하는 Spacelift의 OIDC 구현에 대해 자세히 알아보려면 Spacelift 문서를 읽어보세요.
  • 익명 머신 ID 텔레메트리를 전송하여 서비스 계정에 대한 보안 액세스를 달성하는 방법을 알아보십시오.
Teleport 원문 보기