Infograb logo
AWS 데이터베이스 발견

Teleport는 AWS에 호스팅된 데이터베이스를 자동으로 발견하고 귀하의 Teleport 클러스터에 등록하도록 구성할 수 있습니다.

이 가이드에서는 AWS 데이터베이스 자동 발견을 설정하는 방법을 보여드립니다.

작동 방법

Teleport database 자동 검색에는 두 가지 구성 요소가 포함됩니다:

  1. 새로운 database 또는 이전에 발견된 database의 변경 사항을 감시하는 Teleport Discovery Service.
    발견된 각 database를 Teleport 클러스터의 db 리소스로 동적으로 등록합니다.
    발견되는 database에 대한 연결이 필요하지 않습니다.
  2. Discovery Service에 의해 등록된 동적 db 리소스를 모니터링하는 Teleport Database Service.
    사용자와 database 간의 통신을 프록시합니다.

전제 조건

  • 실행 중인 Teleport 클러스터 버전 17.0.0-dev 이상. Teleport를 시작하려면 가입하여 무료 평가판을 이용하거나 데모 환경 설정 방법을 확인하십시오.

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

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

  • IAM 정책을 생성하고 연결할 수 있는 권한이 있는 AWS 계정.
  • Teleport Discovery Service를 실행할 호스트.
  • Teleport Database Service를 실행할 호스트.
  • AWS에서 호스팅되는 하나 이상의 데이터베이스.

1/8단계. Teleport 설치

Teleport Discovery Service와 Teleport Database Service를 실행할 호스트에 Teleport를 설치합니다.

Database Service은 데이터베이스와의 네트워크 연결이 필요하지만, Discovery Service는 필요하지 않습니다.

Linux 서버에 Teleport 설치하기:

  1. Teleport 에디션에 따라 edition를 다음 중 하나로 할당합니다:

    에디션
    Teleport Enterprise Cloudcloud
    Teleport Enterprise (자가 호스팅)enterprise
    Teleport Community Editionoss
  2. 설치할 Teleport 버전을 가져옵니다. 클러스터에서 자동 에이전트 업데이트가 활성화된 경우, 최신 Teleport 버전을 쿼리하여 업데이트된 내용과의 호환성을 확인합니다:

    TELEPORT_DOMAIN=example.teleport.com
    TELEPORT_VERSION="$(curl https://$TELEPORT_DOMAIN/v1/webapi/automaticupgrades/channel/default/version | sed 's/v//')"

    그렇지 않으면, Teleport 클러스터의 버전을 가져옵니다:

    TELEPORT_DOMAIN=example.teleport.com
    TELEPORT_VERSION="$(curl https://$TELEPORT_DOMAIN/v1/webapi/ping | jq -r '.server_version')"
  3. Linux 서버에 Teleport를 설치합니다:

    curl https://cdn.teleport.dev/install-v15.4.11.sh | bash -s ${TELEPORT_VERSION} edition

    설치 스크립트는 Linux 서버에서 패키지 관리자를 감지하고 이를 사용하여 Teleport 바이너리를 설치합니다. 설치를 사용자 정의하려면 설치 가이드에서 Teleport 패키지 리포지토리에 대해 알아보세요.

2/8단계. Discovery Service IAM 권한

the Discovery Service 가 AWS에 인증하는 데 사용할 수 있는 자격 증명에 대한 액세스를 부여하십시오.

  • the Discovery Service 를 EC2 인스턴스에서 실행 중인 경우, EC2 인스턴스 메타데이터 서비스 방법을 사용할 수 있습니다.
  • the Discovery Service 를 Kubernetes에서 실행 중인 경우, IAM Roles for Service Accounts (IRSA)를 사용할 수 있습니다.
  • 그렇지 않은 경우, 환경 변수를 사용해야 합니다.

Teleport는 EC2 인스턴스에서 실행 중일 때 이를 감지하고 인스턴스 메타데이터 서비스를 사용하여 자격 증명을 가져옵니다.

EC2 인스턴스는 EC2 인스턴스 프로필을 사용하도록 구성되어야 합니다. 자세한 내용은 인스턴스 프로필 사용을 참조하십시오.

AWS의 IAM Roles for Service Accounts (IRSA)를 참조하여 AWS에서 OIDC 공급자를 설정하고 포드의 서비스 계정이 해당 역할을 맡을 수 있도록 하는 AWS IAM 역할을 구성하십시오.

Teleport의 내장 AWS 클라이언트는 다음 환경 변수에서 자격 증명을 읽습니다:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

the Discovery Service 를 시작할 때, 서비스는 /etc/default/teleport 경로에 있는 파일에서 환경 변수를 읽습니다. 이러한 자격 증명을 귀하의 조직에서 확보하십시오. /etc/default/teleport 에는 다음 내용을 포함해야 하며, 각 변수의 값을 교체하십시오:

AWS_ACCESS_KEY_ID=00000000000000000000
AWS_SECRET_ACCESS_KEY=0000000000000000000000000000000000000000
AWS_DEFAULT_REGION=<YOUR_REGION>

Teleport의 AWS 클라이언트는 다음 순서로 다양한 소스에서 자격 증명을 로드합니다:

  • 환경 변수
  • 공유된 자격 증명 파일
  • 공유된 구성 파일 (Teleport는 항상 공유 구성을 활성화함)
  • EC2 인스턴스 메타데이터 (자격 증명만 해당)

공유 자격 증명 파일 또는 공유 구성 파일을 통해 AWS 자격 증명을 제공할 수 있지만, the Discovery Service 를 선택한 프로필 이름에 할당된 AWS_PROFILE 환경 변수를 사용하여 실행해야 합니다.

위 지침에 설명되지 않은 특정 사용 사례가 있는 경우, AWS SDK for Go의 문서를 참조하여 자격 증명 로드 동작에 대한 자세한 설명을 확인하십시오.

AWS IAM 권한 부여

다음 AWS IAM 권한을 Discovery Service AWS IAM 역할에 부착합니다:

데이터베이스 유형

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DocumentDBDiscovery",
            "Effect": "Allow",
            "Action": "rds:DescribeDBClusters",
            "Resource": "*"
        }
    ]
}
StatementPurpose
DocumentDBDiscoveryAmazon DocumentDB 클러스터를 검색합니다.
{/* this comment is here to make the includes below render */}

(!docs/pages/includes/database-access/reference/auto-discovery-unavailable.mdx dbType="DynamoDB"!)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ElastiCacheDiscovery",
            "Effect": "Allow",
            "Action": "elasticache:DescribeReplicationGroups",
            "Resource": "*"
        },
        {
            "Sid": "ElastiCacheFetchMetadata",
            "Effect": "Allow",
            "Action": [
                "elasticache:DescribeCacheClusters",
                "elasticache:DescribeCacheSubnetGroups",
                "elasticache:ListTagsForResource"
            ],
            "Resource": "*"
        }
    ]
}
StatementPurpose
ElastiCacheDiscoveryElastiCache 복제 그룹을 검색합니다.
ElastiCacheFetchMetadata각 데이터베이스에 대한 AWS 태그 및 추가 메타데이터를 Teleport 데이터베이스 레이블로 가져옵니다.
{/* this comment is here to make the includes below render */}

(!docs/pages/includes/database-access/reference/auto-discovery-unavailable.mdx dbType="Keyspaces"!)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "MemoryDBDiscovery",
            "Effect": "Allow",
            "Action": "memorydb:DescribeClusters",
            "Resource": "*"
        },
        {
            "Sid": "MemoryDBFetchMetadata",
            "Effect": "Allow",
            "Action": [
                "memorydb:DescribeSubnetGroups",
                "memorydb:ListTags"
            ],
            "Resource": "*"
        }
    ]
}
StatementPurpose
MemoryDBDiscoveryMemoryDB 데이터베이스 검색.
MemoryDBFetchMetadata각 데이터베이스에 대한 AWS 태그 및 추가 메타데이터를 Teleport 데이터베이스 레이블로 가져오기.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "OpenSearchDiscovery",
            "Effect": "Allow",
            "Action": [
                "es:DescribeDomains",
                "es:ListDomainNames"
            ],
            "Resource": "*"
        },
        {
            "Sid": "OpenSearchFetchMetadata",
            "Effect": "Allow",
            "Action": "es:ListTags",
            "Resource": "*"
        }
    ]
}
StatementPurpose
OpenSearchDiscoveryOpenSearch 도메인을 검색합니다.
OpenSearchFetchMetadata발견된 각 도메인의 AWS 태그를 Teleport 데이터베이스 레이블로 가져옵니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RDSDiscovery",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBClusters",
                "rds:DescribeDBInstances"
            ],
            "Resource": "*"
        }
    ]
}
StatementPurpose
RDSDiscoveryRDS 인스턴스 및 Aurora 클러스터를 검색합니다.

RDS 데이터베이스를 검색하도록 구성된 Teleport Discovery Service는 RDS 인스턴스와 Aurora 클러스터를 모두 검색하려고 시도합니다. rds:DescribeDBInstances 권한은 RDS 인스턴스를 찾기 위해 사용되지만 발견된 Aurora 클러스터에 대한 추가 정보를 찾는 데에도 사용되므로, Aurora 클러스터만 발견해야 하더라도 이 권한을 포함해야 합니다. Aurora 클러스터 검색을 원하지 않으면 rds:DescribeDBClusters 권한을 생략할 수 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RDSProxyDiscovery",
            "Effect": "Allow",
            "Action": "rds:DescribeDBProxies",
            "Resource": "*"
        },
        {
            "Sid": "RDSProxyFetchMetadata",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBProxyEndpoints",
                "rds:ListTagsForResource"
            ],
            "Resource": "*"
        }
    ]
}
Statement목적
RDSProxyDiscoveryRDS 프록시를 발견하고 각 프록시의 기본 엔드포인트를 Teleport 데이터베이스로 등록합니다.
RDSProxyFetchMetadata발견한 프록시의 메타데이터를 가져와 AWS 리소스 태그를 Teleport 데이터베이스 레이블로 가져오고 사용자 지정 엔드포인트를 Teleport 데이터베이스로 등록합니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RedshiftDiscovery",
            "Effect": "Allow",
            "Action": "redshift:DescribeClusters",
            "Resource": "*"
        }
    ]
}
StatementPurpose
RedshiftDiscoveryAmazon Redshift 클러스터를 검색합니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RedshiftServerlessDiscovery",
            "Effect": "Allow",
            "Action": "redshift-serverless:ListWorkgroups",
            "Resource": "*"
        },
        {
            "Sid": "RedshiftServerlessFetchMetadata",
            "Effect": "Allow",
            "Action": [
                "redshift-serverless:ListEndpointAccess",
                "redshift-serverless:ListTagsForResource"
            ],
            "Resource": "*"
        }
    ]
}
StatementPurpose
RedshiftServerlessDiscoveryRedshift Serverless Workgroups를 발견합니다.
RedshiftServerlessFetchMetadata발견된 Workgroups의 메타데이터를 가져와 AWS 태그를 Teleport 데이터베이스 레이블로 가져오고, VPC 엔드포인트를 Teleport 데이터베이스로 등록합니다.

3/8단계. Discovery Service 배포

Teleport 구성 파일 생성

Discovery Service를 실행할 호스트에 teleport.yaml 구성 파일을 생성합니다. discovery_group aws-example 값을 그대로 두거나 더 설명적인 것으로 변경할 수 있습니다.

version: v3
teleport:
  join_params:
    token_name: "/tmp/token"
    method: token
  proxy_server: "teleport.example.com:443"
auth_service:
  enabled: false
proxy_service:
  enabled: false
ssh_service:
  enabled: false
discovery_service:
  enabled: true
  discovery_group: "aws-example"

이 구성 파일은 discovery_service 를 활성화하고 Teleport 클러스터에 조인하도록 구성합니다. Discovery Service의 discovery_group 도 설정합니다. discovery_group aws-example을 나중 단계에서 동적으로 구성할 것이므로, Discovery Service를 다시 시작하지 않고도 Discovery Service의 구성을 제어할 수 있습니다.

Discovery Service는 발견된 리소스를 서로 다른 집합으로 그룹화할 수 있는 구성 매개변수 - discovery_service.discovery_group - 를 노출합니다. 이 매개변수는 서로 다른 클라우드 리소스 집합을 감시하는 Discovery Agents들이 충돌하여 다른 서비스에 의해 생성된 리소스를 삭제하는 것을 방지하는 데 사용됩니다.

여러 Discovery Services를 실행할 때, 동일한 클라우드 리소스를 감시하는 경우 각 서비스가 동일한 discovery_group 값으로 구성되어야 하며, 서로 다른 클라우드 리소스를 감시하는 경우에는 다른 값으로 구성해야 합니다.

동일한 Teleport 클러스터 내에서 혼합된 구성을 실행하는 것이 가능하므로 일부 Discovery Services는 동일한 클라우드 리소스를 감시하도록 구성할 수 있고, 다른 서비스는 서로 다른 리소스를 감시하도록 할 수도 있습니다. 예를 들어, 두 개의 서로 다른 클라우드 계정에서 데이터를 분석하는 4-agent 고가용성 구성은 다음과 같이 구성됩니다.

  • Production 계정에서 데이터를 폴링하기 위해 discovery_group: "prod" 로 구성된 2개의 Discovery Services.
  • Staging 계정에서 데이터를 폴링하기 위해 discovery_group: "staging" 로 구성된 2개의 Discovery Services.

조인 토큰 생성

Discovery 서비스는 Teleport 클러스터에 조인하기 위해 유효한 조인 토큰이 필요합니다.
다음 tctl 명령어를 실행하고 Discovery 서비스가 실행될 서버에 /tmp/token 안에 토큰 출력을 저장하세요:

tctl tokens add --type=discovery --format=text
abcd123-insecure-do-not-use-this

AWS에 많은 인프라를 가진 사용자나 많은 인스턴스를 생성하거나 재생성할 가능성이 있는 사용자에게는 Teleport를 실행하는 새로운 EC2 인스턴스에 조인하기 위한 대체 방법을 고려하십시오:

Discovery Service 시작

호스트가 부팅될 때 the Discovery Service가 자동으로 시작되도록 systemd 서비스를 생성하여 구성합니다. 지침은 the Discovery Service를 설치한 방법에 따라 다릅니다.

the Discovery Service를 실행할 호스트에서 Teleport를 활성화하고 시작합니다:

sudo systemctl enable teleport
sudo systemctl start teleport

the Discovery Service를 실행할 호스트에서 Teleport의 systemd 서비스 구성을 만들고, Teleport 서비스를 활성화한 후 Teleport를 시작합니다:

sudo teleport install systemd -o /etc/systemd/system/teleport.service
sudo systemctl enable teleport
sudo systemctl start teleport

systemctl status teleport 로 the Discovery Service의 상태를 확인하고, journalctl -fu teleport 로 로그를 볼 수 있습니다.

4/8단계. Discovery 그룹 구성

aws-example-discovery-config.yaml 파일을 생성하고 tctl 을 사용할 수 있는 호스트에 저장합니다.

데이터베이스 유형

{{ roleARN="arn:aws:iam::123456789012:role/example-role" }}

version: v1
kind: "discovery_config"
metadata:
  name: "example"
spec:
  # 이 discovery_group의 Discovery 서비스만이
  # 이 동적 구성의 매처를 사용합니다.
  discovery_group: aws-example
  aws:
    # 데이터베이스 유형. 유효한 옵션은:
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색 및 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색합니다.
    # 'opensearch' - Amazon OpenSearch Redis 데이터베이스를 검색합니다.
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색합니다.
  - types: ["docdb"]
    regions: ["us-east-1"]
    # "*"는 와일드카드로, 일치하는 AWS 태그입니다.
    # "*": "*" 을 사용하여 모든 데이터베이스 리소스 태그와 일치시킬 수 있습니다.
    tags:
      "env": "prod" # 이 예시는 env=prod로 태그가 지정된 데이터베이스만 일치합니다.
    # 데이터베이스를 검색하기 위해 AWS API를 호출하기 전에
    # 선택적으로 AWS IAM 역할을 가정합니다.
    assume_role:
      role_arn: "" # "{{ roleARN }}"
      # 외부 AWS 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할
      # 선택적 AWS 외부 ID입니다.
      external_id: "" # "example-external-id"

Database discovery는 DynamoDB 에 대해 사용할 수 없습니다.

DynamoDB 데이터베이스를 Teleport 클러스터에 등록하려면, 정적 구성 또는 동적 db 리소스를 통해 데이터베이스를 수동으로 구성해야 합니다.

자세한 정보는 데이터베이스 액세스 참조를 참조하세요.

{{ roleARN="arn:aws:iam::123456789012:role/example-role" }}

version: v1
kind: "discovery_config"
metadata:
  name: "example"
spec:
  # 이 discovery_group의 Discovery 서비스만이
  # 이 동적 구성의 매처를 사용합니다.
  discovery_group: aws-example
  aws:
    # 데이터베이스 유형. 유효한 옵션은:
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색 및 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색합니다.
    # 'opensearch' - Amazon OpenSearch Redis 데이터베이스를 검색합니다.
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색합니다.
  - types: ["elasticache"]
    regions: ["us-east-1"]
    # "*"는 와일드카드로, 일치하는 AWS 태그입니다.
    # "*": "*" 을 사용하여 모든 데이터베이스 리소스 태그와 일치시킬 수 있습니다.
    tags:
      "env": "prod" # 이 예시는 env=prod로 태그가 지정된 데이터베이스만 일치합니다.
    # 데이터베이스를 검색하기 위해 AWS API를 호출하기 전에
    # 선택적으로 AWS IAM 역할을 가정합니다.
    assume_role:
      role_arn: "" # "{{ roleARN }}"
      # 외부 AWS 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할
      # 선택적 AWS 외부 ID입니다.
      external_id: "" # "example-external-id"

Database discovery는 Keyspaces 에 대해 사용할 수 없습니다.

Keyspaces 데이터베이스를 Teleport 클러스터에 등록하려면, 정적 구성 또는 동적 db 리소스를 통해 데이터베이스를 수동으로 구성해야 합니다.

자세한 정보는 데이터베이스 액세스 참조를 참조하세요.

{{ roleARN="arn:aws:iam::123456789012:role/example-role" }}

version: v1
kind: "discovery_config"
metadata:
  name: "example"
spec:
  # 이 discovery_group의 Discovery 서비스만이
  # 이 동적 구성의 매처를 사용합니다.
  discovery_group: aws-example
  aws:
    # 데이터베이스 유형. 유효한 옵션은:
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색 및 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색합니다.
    # 'opensearch' - Amazon OpenSearch Redis 데이터베이스를 검색합니다.
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색합니다.
  - types: ["memorydb"]
    regions: ["us-east-1"]
    # "*"는 와일드카드로, 일치하는 AWS 태그입니다.
    # "*": "*" 을 사용하여 모든 데이터베이스 리소스 태그와 일치시킬 수 있습니다.
    tags:
      "env": "prod" # 이 예시는 env=prod로 태그가 지정된 데이터베이스만 일치합니다.
    # 데이터베이스를 검색하기 위해 AWS API를 호출하기 전에
    # 선택적으로 AWS IAM 역할을 가정합니다.
    assume_role:
      role_arn: "" # "{{ roleARN }}"
      # 외부 AWS 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할
      # 선택적 AWS 외부 ID입니다.
      external_id: "" # "example-external-id"
{{ roleARN="arn:aws:iam::123456789012:role/example-role" }}

version: v1
kind: "discovery_config"
metadata:
  name: "example"
spec:
  # 이 discovery_group의 Discovery 서비스만이
  # 이 동적 구성의 매처를 사용합니다.
  discovery_group: aws-example
  aws:
    # 데이터베이스 유형. 유효한 옵션은:
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색 및 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색합니다.
    # 'opensearch' - Amazon OpenSearch Redis 데이터베이스를 검색합니다.
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색합니다.
  - types: ["opensearch"]
    regions: ["us-east-1"]
    # "*"는 와일드카드로, 일치하는 AWS 태그입니다.
    # "*": "*" 을 사용하여 모든 데이터베이스 리소스 태그와 일치시킬 수 있습니다.
    tags:
      "env": "prod" # 이 예시는 env=prod로 태그가 지정된 데이터베이스만 일치합니다.
    # 데이터베이스를 검색하기 위해 AWS API를 호출하기 전에
    # 선택적으로 AWS IAM 역할을 가정합니다.
    assume_role:
      role_arn: "" # "{{ roleARN }}"
      # 외부 AWS 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할
      # 선택적 AWS 외부 ID입니다.
      external_id: "" # "example-external-id"
{{ roleARN="arn:aws:iam::123456789012:role/example-role" }}

version: v1
kind: "discovery_config"
metadata:
  name: "example"
spec:
  # 이 discovery_group의 Discovery 서비스만이
  # 이 동적 구성의 매처를 사용합니다.
  discovery_group: aws-example
  aws:
    # 데이터베이스 유형. 유효한 옵션은:
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색 및 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색합니다.
    # 'opensearch' - Amazon OpenSearch Redis 데이터베이스를 검색합니다.
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색합니다.
  - types: ["rds"]
    regions: ["us-east-1"]
    # "*"는 와일드카드로, 일치하는 AWS 태그입니다.
    # "*": "*" 을 사용하여 모든 데이터베이스 리소스 태그와 일치시킬 수 있습니다.
    tags:
      "env": "prod" # 이 예시는 env=prod로 태그가 지정된 데이터베이스만 일치합니다.
    # 데이터베이스를 검색하기 위해 AWS API를 호출하기 전에
    # 선택적으로 AWS IAM 역할을 가정합니다.
    assume_role:
      role_arn: "" # "{{ roleARN }}"
      # 외부 AWS 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할
      # 선택적 AWS 외부 ID입니다.
      external_id: "" # "example-external-id"
{{ roleARN="arn:aws:iam::123456789012:role/example-role" }}

version: v1
kind: "discovery_config"
metadata:
  name: "example"
spec:
  # 이 discovery_group의 Discovery 서비스만이
  # 이 동적 구성의 매처를 사용합니다.
  discovery_group: aws-example
  aws:
    # 데이터베이스 유형. 유효한 옵션은:
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색 및 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색합니다.
    # 'opensearch' - Amazon OpenSearch Redis 데이터베이스를 검색합니다.
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색합니다.
  - types: ["rdsproxy"]
    regions: ["us-east-1"]
    # "*"는 와일드카드로, 일치하는 AWS 태그입니다.
    # "*": "*" 을 사용하여 모든 데이터베이스 리소스 태그와 일치시킬 수 있습니다.
    tags:
      "env": "prod" # 이 예시는 env=prod로 태그가 지정된 데이터베이스만 일치합니다.
    # 데이터베이스를 검색하기 위해 AWS API를 호출하기 전에
    # 선택적으로 AWS IAM 역할을 가정합니다.
    assume_role:
      role_arn: "" # "{{ roleARN }}"
      # 외부 AWS 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할
      # 선택적 AWS 외부 ID입니다.
      external_id: "" # "example-external-id"
{{ roleARN="arn:aws:iam::123456789012:role/example-role" }}

version: v1
kind: "discovery_config"
metadata:
  name: "example"
spec:
  # 이 discovery_group의 Discovery 서비스만이
  # 이 동적 구성의 매처를 사용합니다.
  discovery_group: aws-example
  aws:
    # 데이터베이스 유형. 유효한 옵션은:
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색 및 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색합니다.
    # 'opensearch' - Amazon OpenSearch Redis 데이터베이스를 검색합니다.
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색합니다.
  - types: ["redshift"]
    regions: ["us-east-1"]
    # "*"는 와일드카드로, 일치하는 AWS 태그입니다.
    # "*": "*" 을 사용하여 모든 데이터베이스 리소스 태그와 일치시킬 수 있습니다.
    tags:
      "env": "prod" # 이 예시는 env=prod로 태그가 지정된 데이터베이스만 일치합니다.
    # 데이터베이스를 검색하기 위해 AWS API를 호출하기 전에
    # 선택적으로 AWS IAM 역할을 가정합니다.
    assume_role:
      role_arn: "" # "{{ roleARN }}"
      # 외부 AWS 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할
      # 선택적 AWS 외부 ID입니다.
      external_id: "" # "example-external-id"
{{ roleARN="arn:aws:iam::123456789012:role/example-role" }}

version: v1
kind: "discovery_config"
metadata:
  name: "example"
spec:
  # 이 discovery_group의 Discovery 서비스만이
  # 이 동적 구성의 매처를 사용합니다.
  discovery_group: aws-example
  aws:
    # 데이터베이스 유형. 유효한 옵션은:
    # 'docdb' - Amazon DocumentDB 데이터베이스를 검색 및 등록합니다.
    # 'elasticache' - Amazon ElastiCache Redis 데이터베이스를 검색합니다.
    # 'memorydb' - Amazon MemoryDB Redis 데이터베이스를 검색합니다.
    # 'opensearch' - Amazon OpenSearch Redis 데이터베이스를 검색합니다.
    # 'rds' - Amazon RDS 및 Aurora 데이터베이스를 검색합니다.
    # 'rdsproxy' - Amazon RDS Proxy 데이터베이스를 검색합니다.
    # 'redshift' - Amazon Redshift 데이터베이스를 검색합니다.
    # 'redshift-serverless' - Amazon Redshift Serverless 데이터베이스를 검색합니다.
  - types: ["redshift-serverless"]
    regions: ["us-east-1"]
    # "*"는 와일드카드로, 일치하는 AWS 태그입니다.
    # "*": "*" 을 사용하여 모든 데이터베이스 리소스 태그와 일치시킬 수 있습니다.
    tags:
      "env": "prod" # 이 예시는 env=prod로 태그가 지정된 데이터베이스만 일치합니다.
    # 데이터베이스를 검색하기 위해 AWS API를 호출하기 전에
    # 선택적으로 AWS IAM 역할을 가정합니다.
    assume_role:
      role_arn: "" # "{{ roleARN }}"
      # 외부 AWS 계정에서 역할을 가정하기 위해 데이터베이스 서비스가 사용할
      # 선택적 AWS 외부 ID입니다.
      external_id: "" # "example-external-id"

discovery_config 를 생성합니다:

tctl create aws-example-discovery-config.yaml

우리가 이전에 구성한 Discovery Service는 동일한 discovery_group 에 있으며, 이 discovery_config 를 사용하여 AWS 데이터베이스를 발견하기 시작합니다. 데이터베이스를 발견하면 Discovery Service는 이를 db 자원으로 귀하의 Teleport 클러스터에 등록합니다.

Teleport db 자원은 Teleport Database Service가 데이터베이스에 접근을 제공하기 위해 사용할 데이터베이스 사양을 나타냅니다. Database Service 인스턴스가 레이블 선택기를 통해 db 자원을 일치시키면, 정기적으로 단명하는 db_server 자원을 생성하여 데이터베이스에 심장 박동을 보내기 시작합니다. tsh db lstctl db ls 와 같은 도구는 오직 db_server 자원, 즉 Database Service 인스턴스가 접근을 제공하는 데이터베이스만 표시합니다.

5/8단계. 등록된 데이터베이스 나열하기

데이터베이스 서비스가 발견된 데이터베이스에 대한 접근을 제공하기 위해 설정하기 전에,
실제로 Discovery 서비스가 데이터베이스를 발견하고 있는지 확인해야 합니다.

tctl 로 동적으로 등록된 데이터베이스를 나열할 수 있습니다.
Discovery 서비스는 Teleport 클러스터에 등록하는 모든 데이터베이스에 teleport.dev/origin: cloud 라는 레이블을 추가합니다.

Discovery 서비스가 예상하는 데이터베이스에 대한 db 리소스를 등록했는지 확인하세요:

tctl get db

특정 데이터베이스를 확인하려면:

tctl get db/<database-name>

발견되어야 할 데이터베이스에 해당하는 db 리소스가 보이지 않는 경우,
Discovery Service 문제 해결을 참조하세요.

각 발견된 데이터베이스의 이름에는 고유성을 보장하기 위해 추가 식별 정보가 첨부됩니다.
추가 정보에는 다음이 포함될 수 있습니다:

  • 엔드포인트 유형 (예: "reader" 엔드포인트)
  • 매칭 유형
  • AWS 리전
  • AWS 계정 ID.

예를 들어, "my-postgres"라는 이름의 RDS Aurora 데이터베이스가
AWS 계정 "123456789012"의 us-east-1 리전에서 발견되면, Teleport에서는
"my-postgres-rds-aurora-us-east-1-123456789012"로 이름이 지정됩니다.

발견된 데이터베이스는 AWS 데이터베이스 이름과 엔드포인트 유형으로만 구성된
더 짧은 표시 이름도 가집니다. 예를 들어 "my-postgres" 또는 "my-postgres-reader"입니다.
tctltsh 명령에는 전체 이름 또는 표시 이름을 모두 사용할 수 있지만,
표시 이름이 모호한 경우 전체 이름을 사용해야 합니다.

AWS 데이터베이스 리소스에 TeleportDatabaseName AWS 태그를 적용하여
데이터베이스 이름을 재정의할 수 있습니다. 이는 db 이름으로 문자 그대로 사용되며,
즉, 추가 식별 정보가 첨부되지 않습니다.

6/8단계. 데이터베이스 서비스 IAM 권한

데이터베이스 서비스 가 AWS에 인증하는 데 사용할 수 있는 자격 증명에 대한 액세스를 부여하십시오.

  • 데이터베이스 서비스 를 EC2 인스턴스에서 실행 중인 경우, EC2 인스턴스 메타데이터 서비스 방법을 사용할 수 있습니다.
  • 데이터베이스 서비스 를 Kubernetes에서 실행 중인 경우, IAM Roles for Service Accounts (IRSA)를 사용할 수 있습니다.
  • 그렇지 않은 경우, 환경 변수를 사용해야 합니다.

Teleport는 EC2 인스턴스에서 실행 중일 때 이를 감지하고 인스턴스 메타데이터 서비스를 사용하여 자격 증명을 가져옵니다.

EC2 인스턴스는 EC2 인스턴스 프로필을 사용하도록 구성되어야 합니다. 자세한 내용은 인스턴스 프로필 사용을 참조하십시오.

AWS의 IAM Roles for Service Accounts (IRSA)를 참조하여 AWS에서 OIDC 공급자를 설정하고 포드의 서비스 계정이 해당 역할을 맡을 수 있도록 하는 AWS IAM 역할을 구성하십시오.

Teleport의 내장 AWS 클라이언트는 다음 환경 변수에서 자격 증명을 읽습니다:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

데이터베이스 서비스 를 시작할 때, 서비스는 /etc/default/teleport 경로에 있는 파일에서 환경 변수를 읽습니다. 이러한 자격 증명을 귀하의 조직에서 확보하십시오. /etc/default/teleport 에는 다음 내용을 포함해야 하며, 각 변수의 값을 교체하십시오:

AWS_ACCESS_KEY_ID=00000000000000000000
AWS_SECRET_ACCESS_KEY=0000000000000000000000000000000000000000
AWS_DEFAULT_REGION=<YOUR_REGION>

Teleport의 AWS 클라이언트는 다음 순서로 다양한 소스에서 자격 증명을 로드합니다:

  • 환경 변수
  • 공유된 자격 증명 파일
  • 공유된 구성 파일 (Teleport는 항상 공유 구성을 활성화함)
  • EC2 인스턴스 메타데이터 (자격 증명만 해당)

공유 자격 증명 파일 또는 공유 구성 파일을 통해 AWS 자격 증명을 제공할 수 있지만, 데이터베이스 서비스 를 선택한 프로필 이름에 할당된 AWS_PROFILE 환경 변수를 사용하여 실행해야 합니다.

위 지침에 설명되지 않은 특정 사용 사례가 있는 경우, AWS SDK for Go의 문서를 참조하여 자격 증명 로드 동작에 대한 자세한 설명을 확인하십시오.

데이터베이스 서비스에 대한 AWS IAM 역할을 생성하고 다음 권한을 첨부하십시오:

데이터베이스 유형

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DocumentDBConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id:role/DatabaseUserRole"
            ]
        },
        {
            "Sid": "DocumentDBCheckDomainURL",
            "Effect": "Allow",
            "Action": "rds:DescribeDBClusters",
            "Resource": "*"
        }
    ]
}
StatementPurpose
DocumentDBConnectAsIAMRoleIAM 인증으로 DocumentDB 클러스터에 연결하기 위해 IAM 역할을 가져옵니다.
DocumentDBCheckDomainURLDiscovery Service에 의해 자동 검색된 경우 도메인의 URL을 검증합니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DynamoDBConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id\:role/DatabaseUserRole"
            ]
        },
        {
            "Sid": "DynamoDBSessionTagging",
            "Effect": "Allow",
            "Action": "sts:TagSession",
            "Resource": [
                "*"
            ]
        }
    ]
}
StatementPurpose
DynamoDBConnectAsIAMRoleDynamoDB에 요청을 전달하기 위해 IAM 역할을 가정합니다.
DynamoDBSessionTaggingTeleport 데이터베이스 구성의 aws.session_tags 아래에 태그가 지정된 경우 가정된 역할 세션에 태그를 추가합니다.

세션 태깅 권한은 Teleport 데이터베이스 구성의 aws.session_tags 섹션에서 태그를 구성한 경우에만 필요합니다.

{/* this comment is here to make the include below it render */}

(!docs/pages/includes/database-access/reference/aws-iam/redis/access-policy.mdx dbType="ElastiCache" permissionType="elasticache"!)

다음 링크를 참조하십시오.  
[ElastiCache에 대한 IAM 인증](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/auth-iam.html)  
자세한 내용은 여기를 클릭하십시오.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "KeyspacesConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id:role/DatabaseUserRole"
            ]
        }
    ]
}
StatementPurpose
KeyspacesConnectAsIAMRoleIAM 역할을 가정하여 Keyspaces로 요청을 전달합니다.

MemoryDB는 Redis 엔진 버전 7.0 이상에서 IAM 인증을 지원합니다. 이는 MemoryDB에 대한 Teleport 액세스를 구성하는 권장 방법입니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "MemoryDBDescribeUsers",
            "Effect": "Allow",
            "Action": "memorydb:DescribeUsers",
            "Resource": "*"
        },
        {
            "Sid": "MemoryDBConnect",
            "Effect": "Allow",
            "Action": "memorydb:Connect",
            "Resource": [
                "arn:aws:memorydb:us-east-2:aws-account-id:replicationgroup:replication-group",
                "arn:aws:memorydb:us-east-2:aws-account-id:user:*"
            ]
        }
    ]
}
StatementPurpose
MemoryDBDescribeUsers사용자가 IAM 인증과 호환되는지 확인합니다.
MemoryDBConnectIAM 인증을 사용하여 연결합니다.

자세한 내용은
MemoryDB에 대한 IAM 인증 를 참조하십시오.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "OpenSearchCheckDomainURL",
            "Effect": "Allow",
            "Action": "es:DescribeDomains",
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "OpenSearchConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id\:role/DatabaseUserRole"
            ]
        }
    ]
}
StatementPurpose
OpenSearchCheckDomainURL발견 서비스에 의해 자동 발견된 도메인의 URL을 검증합니다.
OpenSearchConnectAsIAMRoleOpenSearch로 요청을 전달하기 위해 IAM 역할을 가정합니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RDSAutoEnableIAMAuth",
            "Effect": "Allow",
            "Action": [
                "rds:ModifyDBCluster",
                "rds:ModifyDBInstance"
            ],
            "Resource": "*"
        },
        {
            "Sid": "RDSConnect",
            "Effect": "Allow",
            "Action": "rds-db:connect",
            "Resource": "*"
        },
        {
            "Sid": "RDSFetchMetadata",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBClusters",
                "rds:DescribeDBInstances"
            ],
            "Resource": "*"
        }
    ]
}
StatementPurpose
RDSAutoEnableIAMAuthRDS 인스턴스와 Aurora 클러스터에서 IAM 인증을 자동으로 활성화합니다.
RDSConnect데이터베이스에 연결하기 위한 IAM 인증 토큰을 생성합니다.
RDSFetchMetadataAWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.

Teleport 데이터베이스 서비스는 rds:ModifyDBInstancerds:ModifyDBCluster 를 사용하여 RDS 인스턴스와 Aurora 클러스터에서 각각 IAM 인증을 자동으로 활성화합니다. 데이터베이스에서 IAM 인증이 이미 활성화된 경우 RDSAutoEnableIAMAuth 권한을 생략할 수 있습니다.

rds-db:connect 권한은 데이터베이스에 연결하는 데 필요합니다.
권한의 범위를 특정 데이터베이스, 리전 또는 사용자만 허용하도록 줄일 수 있습니다.
리소스 ARN은 다음 형식을 가집니다:

arn:aws:rds-db:{Region}:{AccountID}:dbuser:{ResourceID}/{UserName}

rds-db:connect 권한 부여 구문에 대한 자세한 내용은
IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용 을 참조하십시오.

텔레포트 검색 서비스에 의해 발견된 데이터베이스는 완전한 메타데이터로 등록해야 하므로, 모든 AWS 데이터베이스가 자동 검색되는 경우 RDSFetchMetadata 권한을 생략할 수도 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RDSProxyConnect",
            "Effect": "Allow",
            "Action": "rds-db:connect",
            "Resource": "*"
        },
        {
            "Sid": "RDSProxyFetchMetadata",
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBProxies",
                "rds:DescribeDBProxyEndpoints"
            ],
            "Resource": "*"
        }
    ]
}
StatementPurpose
RDSProxyConnect데이터베이스에 연결하기 위해 IAM 인증 Token을 생성합니다.
RDSProxyFetchMetadataAWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 지역과 같은 누락된 정보를 찾습니다.

rds-db:connect 권한은 데이터베이스에 연결하는 데 필요합니다.
권한의 범위를 특정 데이터베이스, 리전 또는 사용자만 허용하도록 줄일 수 있습니다.
리소스 ARN은 다음 형식을 가집니다:

arn:aws:rds-db:{Region}:{AccountID}:dbuser:{ResourceID}/{UserName}

rds-db:connect 권한 부여 구문에 대한 자세한 내용은
IAM 데이터베이스 액세스를 위한 IAM 정책 생성 및 사용 을 참조하십시오.

텔레포트 검색 서비스에 의해 발견된 데이터베이스는 완전한 메타데이터로 등록해야 하므로, 모든 AWS 데이터베이스가 자동 검색되는 경우 RDSProxyFetchMetadata 권한을 생략할 수도 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RedshiftConnectAsDBUser",
            "Effect": "Allow",
            "Action": "redshift:GetClusterCredentials",
            "Resource": "*"
        },
        {
            "Sid": "RedshiftConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id:role/DatabaseUserRole"
            ]
        },
        {
            "Sid": "RedshiftFetchMetadata",
            "Effect": "Allow",
            "Action": "redshift:DescribeClusters",
            "Resource": "*"
        }
    ]
}
Statement목적
RedshiftConnectAsDBUser기존 데이터베이스 사용자로 데이터베이스에 연결합니다.
RedshiftConnectAsIAMRoleIAM 역할을 가정하여 역할의 IAM 권한에서 1:1로 매핑된 권한으로 데이터베이스에 연결합니다.
RedshiftFetchMetadataAWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.

RedshiftConnectAsDBUser 문장의 범위를 줄이려면 특정 사용자, 데이터베이스 및 데이터베이스 그룹만 허용하도록 업데이트할 수 있습니다.
지정할 수 있는 리소스 ARN은 다음 형식을 가집니다:

arn:aws:redshift:{Region}:{AccountID}:dbuser:{ClusterName}/{UserName}arn:aws:redshift:{Region}:{AccountID}:dbname:{ClusterName}/{DatabaseName}arn:aws:redshift:{Region}:{AccountID}:dbgroup:{ClusterName}/{DatabaseGroupName}

redshift:GetClusterCredentials 권한 부여 구문에 대한 자세한 내용은 GetClusterCredentials를 호출할 수 있는 권한이 있는 IAM 역할 또는 사용자 생성하기를 참조하세요.

기존 데이터베이스 사용자로 인증하거나 자동으로 데이터베이스에 매핑될 IAM 역할로 인증할 수 있습니다.
해당 IAM 문장은 사용하고자 하는 방법에 대해서만 필요합니다.
IAM 역할이 데이터베이스 서비스의 신원을 신뢰할 수 있는 주체로 지정하고, 두 신원이 동일한 AWS 계정에 있는 경우,
RedshiftConnectAsIAMRole 문장도 생략할 수 있습니다.

텔레포트 검색 서비스에 의해 발견된 데이터베이스는 완전한 메타데이터로 등록해야 하므로, 모든 AWS 데이터베이스가 자동 검색되는 경우 RedshiftFetchMetadata 권한을 생략할 수도 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RedshiftServerlessConnectAsIAMRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::aws-account-id:role/DatabaseUserRole"
            ]
        },
        {
            "Sid": "RedshiftServerlessFetchMetadata",
            "Effect": "Allow",
            "Action": [
                "redshift-serverless:GetEndpointAccess",
                "redshift-serverless:GetWorkgroup"
            ],
            "Resource": "*"
        }
    ]
}
StatementPurpose
RedshiftServerlessFetchMetadataAWS 태그를 데이터베이스 레이블로 자동으로 가져오거나 데이터베이스의 AWS 리전과 같은 누락된 정보를 찾습니다.
RedshiftServerlessConnectAsIAMRole데이터베이스 사용자로 연결하기 위해 IAM 역할을 가정합니다.

텔레포트 검색 서비스에 의해 발견된 데이터베이스는 완전한 메타데이터로 등록해야 하므로, 모든 AWS 데이터베이스가 자동 검색되는 경우 RedshiftServerlessFetchMetadata 권한을 생략할 수도 있습니다.

Redshift Serverless는 IAM 역할을 데이터베이스 사용자에 매핑합니다. Teleport 데이터베이스 서비스는 IAM 인증 토큰을 생성하기 위해 이러한 "액세스" IAM 역할을 가정할 수 있어야 합니다.

7/8단계. 데이터베이스 서비스 배포하기

데이터베이스 연결 구성

Discovery 서비스와 달리, 데이터베이스 서비스는 Teleport 클러스터에 대한 접근을 제공하기 위해
데이터베이스에 대한 네트워크 연결이 필요합니다.
데이터베이스 서비스에 대해 여러 네트워크 도달 가능 요구 사항이 충족되어야 합니다:

  1. 데이터베이스 서비스는 데이터베이스에 대한 네트워크 경로를 가집니다.
  2. 데이터베이스 서비스는 Teleport 클러스터에 대한 네트워크 경로를 가집니다.
  3. 데이터베이스 서비스 보안 그룹은 데이터베이스에 대한 아웃바운드 트래픽을 허용합니다.
  4. 데이터베이스 서비스 보안 그룹은 Teleport 클러스터에 대한 아웃바운드 트래픽을 허용합니다.
  5. 데이터베이스 보안 그룹은 데이터베이스 서비스로부터의 인바운드 트래픽을 허용합니다.

당신의 데이터베이스가 엄격한 보안 그룹이 부착된 프라이빗 서브넷에 배포된 경우가
매우 높은 가능성이므로, 일반적으로 같은 VPC에 데이터베이스 서비스 인스턴스를 배포해야 하며,
아마도 같은 서브넷에 배포하고, 데이터베이스가 인바운드 트래픽을 허용하는
보안 그룹이 부착된 상태여야 합니다.
Teleport 데이터베이스 서비스는 Teleport 클러스터에 도달하기 위해
AWS NAT 게이트웨이나 인터넷 게이트웨이를 통해 공용 인터넷에 대한 경로가 필요할 수 있습니다.

이것은 네트워크 요구 사항이나 제안의 전체 목록이 아니며,
이는 특정 네트워킹 설정에 따라 달라집니다.

Teleport 구성 파일 생성

Discovery Service를 실행할 호스트에 teleport.yaml 구성 파일을 생성합니다:

version: v3
teleport:
  join_params:
    token_name: "/tmp/token"
    method: token
  proxy_server: "teleport.example.com:443"
auth_service:
  enabled: false
proxy_service:
  enabled: false
ssh_service:
  enabled: false
db_service:
  enabled: true
  resources:
    - labels:
        "account-id": "*"
        "region": "us-east-1"
        "teleport.dev/cloud": "AWS"
        "teleport.dev/origin": "cloud"

이 구성 파일은 db_service 를 활성화하고 Teleport 클러스터에 조인하도록 구성합니다.
db_service.resources 섹션은 레이블 선택기 목록입니다.
데이터베이스 서비스는 이러한 레이블을 가진 db 리소스와 일치하고 짧은 수명의 db_server 리소스를 정기적으로 생성하여 데이터베이스의 하트비트를 시작합니다.

이 경우, 모든 AWS 계정에서 us-east-1 지역의 자동 검색된 AWS 데이터베이스와 일치합니다
("*"는 와일드카드이며, 레이블 키와/or 값으로 사용할 수 있습니다).
레벨 선택기를 조정하여 더 구체적인 데이터베이스와 일치하도록 만들 수 있습니다.

AWS 데이터베이스에 첨부된 AWS 태그는 일부 다른 식별 메타데이터와 함께 Teleport db 레이블로 가져옵니다. 사용 가능한 데이터베이스 레이블에 대한 자세한 내용은 Database Labels Reference 를 참조하십시오.

조인 토큰 생성

Database 서비스는 Teleport 클러스터에 조인하기 위해 유효한 조인 토큰이 필요합니다.
다음 tctl 명령어를 실행하고 Database 서비스가 실행될 서버에 /tmp/token 안에 토큰 출력을 저장하세요:

tctl tokens add --type=db --format=text
abcd123-insecure-do-not-use-this

AWS에 많은 인프라를 가진 사용자나 많은 인스턴스를 생성하거나 재생성할 가능성이 있는 사용자에게는 Teleport를 실행하는 새로운 EC2 인스턴스에 조인하기 위한 대체 방법을 고려하십시오:

데이터베이스 서비스 시작

호스트가 부팅될 때 the Database Service가 자동으로 시작되도록 systemd 서비스를 생성하여 구성합니다. 지침은 the Database Service를 설치한 방법에 따라 다릅니다.

the Database Service를 실행할 호스트에서 Teleport를 활성화하고 시작합니다:

sudo systemctl enable teleport
sudo systemctl start teleport

the Database Service를 실행할 호스트에서 Teleport의 systemd 서비스 구성을 만들고, Teleport 서비스를 활성화한 후 Teleport를 시작합니다:

sudo teleport install systemd -o /etc/systemd/system/teleport.service
sudo systemctl enable teleport
sudo systemctl start teleport

systemctl status teleport 로 the Database Service의 상태를 확인하고, journalctl -fu teleport 로 로그를 볼 수 있습니다.

8/8단계. 데이터베이스 서버 목록

데이터베이스 서비스가 발견된 데이터베이스를 프록시하고 있는지 확인하려면 다음 tctl 명령을 실행합니다:

# 필요한 경우 이러한 쉼표로 구분된 필터링 레이블을 조정하세요

tctl db ls teleport.dev/origin=cloud,teleport.dev/cloud=AWS,region=us-east-1,account-id="*"

예상했던 데이터베이스가 보이지 않으면,
아래 Database Service troubleshooting을 참조하십시오.

이 가이드는 Discovery Service 및 Database Service로 AWS 데이터베이스 자동 검색을 설정하는 방법을 보여주지만, 데이터베이스 사용자 프로비저닝에 대해서는 다루지 않습니다.

발견된 데이터베이스에 Teleport를 통해 연결하려면 추가 Teleport RBAC 구성 및 아마도 IAM 구성이 필요할 수 있습니다.

데이터베이스 사용자 프로비저닝 및 구성에 대한 정보는
Enroll AWS Databases 의 적절한 가이드를 참조하십시오.

다음

  • Teleport Database Service에 의한 동적 등록에 대해 알아보세요.
  • 연결하여 시작하세요.
  • 외부 AWS 계정에서 AWS 데이터베이스 연결.
  • 데이터베이스 사용자 프로비저닝 및 구성에 대한 정보는
    Enroll AWS Databases 의 적절한 가이드를 참조하십시오.

문제 해결

Discovery Service 문제 해결

먼저, 발견된 database이 있는지 확인하세요.
이를 위해 tctl get db 명령을 사용하고, 예상되는 database이 이미 Teleport 클러스터에 등록되어 있는지 확인하세요.

목록에 일부 database이 나타나지 않으면, Discovery Service 선택기 레이블이 누락된 database 태그와 일치하는지 확인하거나 Discovery Service 로그에서 권한 오류를 살펴보세요.

Discovery Service가 올바른 AWS 계정의 자격 증명으로 실행되고 있는지 확인하세요. 다른 AWS 계정에서 리소스를 발견할 수 있지만, 이 경우 다른 AWS 계정의 역할을 가정하도록 구성해야 합니다.

실행 중인 Discovery Service가 여러 개인지 확인하세요:

tctl inventory status --connected

여러 개의 Discovery Service를 실행 중인 경우, 동일한 클라우드 database를 감시하는 경우에는 각 서비스가 동일한 discovery_group 값으로 구성되어야 하며, 다른 클라우드 database를 감시하는 경우에는 다른 값으로 구성되어야 합니다.
이 구성이 올바르지 않으면, 일반적인 증상으로는 db 리소스가 Teleport 클러스터의 레지스트리에서 간헐적으로 삭제되는 것이 있습니다.

데이터베이스 서비스 문제 해결

tctl db ls 에 데이터베이스가 나타나지 않음

tctl get db 명령어가 예상한 데이터베이스를 반환하지만 tctl db ls 명령어에 포함되지 않는 경우, db_service.resources 섹션이 올바르게 설정되었는지 확인하십시오. 예를 들면:

db_service:
  enabled: "yes"
  resources:
    - labels:
        "env": "prod"

섹션이 올바르게 구성되었지만 데이터베이스가 여전히 나타나지 않으면, Teleport에서 데이터베이스를 나열할 수 있는 적절한 권한이 있는지 확인하십시오. 데이터베이스 레이블과 일치하고 dbdb_server 객체에 대한 "read"와 "list" 동작을 허용하는 Teleport 역할이 있어야 합니다. 다음은 클러스터의 모든 데이터베이스에 대한 이러한 권한을 부여하는 예입니다:

kind: role
version: v6
metadata:
  name: view-all-databases
spec:
  allow:
    db_labels:
      "*": "*"
    rules:
      - resources: [db_server, db]
        verbs: [read, list]

데이터베이스에 연결할 때 오류 발생

이 섹션은 이미 데이터베이스 사용자를 프로비저닝하고 데이터베이스 사용자에 대해 Teleport RBAC을 설정했다고 가정합니다. 특정 가이드를 따라 AWS 데이터베이스 등록하시기 바랍니다.

데이터베이스에 연결하려고 할 때 연결 오류가 발생하는 경우, 우선 대상 데이터베이스에 대해 여러 db_server 하트비트 리소스가 있는지 확인하십시오: tctl get db_server/yourDatabaseName . 만약 그렇다면, 그것은 여러 Teleport 데이터베이스 서비스 인스턴스가 데이터베이스를 프록시하고 있다는 의미입니다. 이는 HA 설정으로 문제 해결을 복잡하게 만듭니다. Teleport는 이러한 데이터베이스 서비스 인스턴스 중 하나를 임의로 선택하여 연결을 프록시하며, 그 중 하나가 데이터베이스 엔드포인트에 도달할 수 없거나 권한이 부족한 경우, 임의의 연결 오류가 발생할 수 있습니다.

연결 오류가 일관되더라도 오류를 해결하는 동안 목표 db 와 일치하는 인스턴스가 하나만 있도록 Teleport 데이터베이스 서비스 인스턴스의 수를 줄이거나 구성해야 합니다. tctl get db_server/yourDatabaseNamedb_server 가 하나인지 확인한 후 다시 연결을 시도하십시오.

DEBUG 수준의 로깅을 활성화하여 Teleport 데이터베이스 서비스 로그를 확인하고 네트워크 또는 권한 오류를 확인하십시오.

일반적인 문제 해결 단계를 위해 데이터베이스 액세스 문제 해결를 참조하십시오.

또한 특정 데이터베이스 유형에 대한 가이드는 AWS 데이터베이스 등록에서 더 구체적인 문제 해결 정보를 제공할 수 있습니다.

Teleport 원문 보기