

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

# Amazon OpenSearch Ingestion 파이프라인을 다른 서비스 및 애플리케이션과 통합
<a name="configure-client"></a>

Amazon OpenSearch Ingestion 파이프라인으로 데이터를 성공적으로 수집하려면 파이프라인 엔드포인트로 데이터를 전송하도록 클라이언트 애플리케이션(*소스*)을 구성해야 합니다. 소스는 Fluent Bit 로그, OpenTelemetry Collector 또는 간단한 S3 버킷과 같은 클라이언트일 수 있습니다. 정확한 구성은 각 클라이언트마다 다릅니다.

소스 구성 중 중요한 차이점은 (OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션으로 직접 데이터를 전송하는 것과 비교하여) AWS 서비스 이름(`osis`)과 호스트 엔드포인트이며, 이는 파이프라인 엔드포인트여야 합니다.

## 수집 엔드포인트 구성
<a name="configure-client-endpoint"></a>

파이프라인으로 데이터를 수집하려면 데이터를 수집 엔드포인트로 전송합니다. 수집 URL의 위치를 찾으려면 **파이프라인 설정** 페이지로 이동한 다음 **수집 URL**을 복사합니다.

![\[Pipeline settings page showing details like status, capacity, and ingestion URL for data input.\]](http://docs.aws.amazon.com/ko_kr/opensearch-service/latest/developerguide/images/pipeline-endpoint.png)


[OTel 추적](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/otel-trace/) 및 [OTel 메트릭](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/otel-metrics-source/)과 같은 풀 기반 소스에 대한 전체 수집 엔드포인트를 구성하려면 파이프라인 구성의 수집 경로를 수집 URL에 추가하세요.

예를 들어 파이프라인 구성의 수집 경로가 다음과 같다고 가정해 보겠습니다.

![\[Input field for HTTP source path with example "/my/test_path" entered.\]](http://docs.aws.amazon.com/ko_kr/opensearch-service/latest/developerguide/images/ingestion-path.png)


클라이언트 구성에서 지정하는 전체 수집 엔드포인트는 `https://ingestion-pipeline-abcdefg.us-east-1.osis.amazonaws.com/my/test_path`와 같은 형식을 취합니다.

## 수집 역할 생성
<a name="configure-client-auth"></a>

OpenSearch Ingestion에 대한 모든 요청은 [서명 버전 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)로 서명되어야 합니다. 요청에 서명하는 역할에는 최소한 `osis:Ingest` 작업에 대한 권한이 부여되어야 하며, 해당 역할은 OpenSearch Ingestion 파이프라인으로 데이터를 보낼 수 있습니다.

예를 들어, 다음 AWS Identity and Access Management (IAM) 정책은 해당 역할이 단일 파이프라인으로 데이터를 전송하도록 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "osis:Ingest",
      "Resource": "arn:aws:osis:us-east-1:111122223333:pipeline/pipeline-name"
    }
  ]
}
```

------

**참고**  
*모든* 파이프라인에 이 역할을 사용하려면 `Resource` 요소의 ARN을 와일드카드(\$1)로 바꾸세요.

### 교차 계정 수집 액세스 제공
<a name="configure-client-cross-account"></a>

**참고**  
VPC 파이프라인이 아닌 퍼블릭 파이프라인에 대한 교차 계정 수집 액세스만 제공할 수 있습니다.

소스 애플리케이션을 포함하는 계정 AWS 계정과 같은 다른에서 파이프라인으로 데이터를 수집해야 할 수 있습니다. 파이프라인에 쓰는 보안 주체가 파이프라인 자체와 다른 계정에 있는 경우, 파이프라인으로 데이터를 수집하는 다른 IAM 역할을 신뢰할 수 있도록 보안 주체를 구성해야 합니다.

**교차 계정 수집 권한 구성**

1. 파이프라인과 동일한 내에 `osis:Ingest` 권한(이전 섹션에서 설명)을 AWS 계정 사용하여 수집 역할을 생성합니다. 자세한 내용은 [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)을 참조하세요.

1. 다른 계정의 보안 주체가 이를 수임할 수 있도록 수집 역할에 [신뢰 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)을 연결하세요.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "AWS": "arn:aws:iam::111122223333:root"
         },
        "Action": "sts:AssumeRole"
     }]
   }
   ```

------

1. 다른 계정에서는 수집 역할을 맡도록 클라이언트 애플리케이션(예: Fluent Bit)을 구성하세요. 이 기능을 사용하려면 애플리케이션 계정이 애플리케이션 사용자 또는 역할에 수집 역할을 맡을 수 있는 권한을 부여해야 합니다.

   다음 예제 ID 기반 정책은 연결된 보안 주체가 파이프라인 계정에서 `ingestion-role`을 수임하도록 허용합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "sts:AssumeRole",
         "Resource": "arn:aws:iam::111122223333:role/ingestion-role"
       }
     ]
   }
   ```

------

그러면 클라이언트 애플리케이션이 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 작업을 사용하여 `ingestion-role`을 수임하고 관련 파이프라인으로 데이터를 수집할 수 있습니다.

# Atlassian 서비스에서 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-atlassian"></a>

Atlassian Jira 및 Confluence 소스 플러그인을 사용하여 OpenSearch Ingestion 파이프라인으로 데이터를 수집할 수 있습니다. 이러한 통합을 통해 전체 Jira 프로젝트와 Confluence 스페이스를 동기화하는 동시에, 업데이트의 지속적인 모니터링 및 자동 동기화를 통해 실시간 연관성을 유지하여 검색 가능한 통합 지식 기반을 생성할 수 있습니다.

------
#### [ Integrating with Jira ]

Jira 콘텐츠를 OpenSearch에 통합하여 강력한 컨텍스트 검색 기능으로 Jira 경험을 혁신합니다. Data Prepper [Atlassian Jira](https://www.atlassian.com/software/jira) 소스 플러그인을 사용하면 업데이트의 지속적인 모니터링 및 자동 동기화를 통해 실시간 연관성을 유지하면서 전체 Jira 프로젝트를 동기화하여 검색 가능한 통합 지식 기반을 생성할 수 있습니다. 이 통합을 통해 특정 프로젝트, 문제 유형 및 상태에 대한 유연한 필터링 옵션을 통해 데이터를 동기화할 수 있으므로 필요한 정보만 가져올 수 있게 됩니다.

안전하고 안정적인 연결을 보장하기 위해 플러그인은 기본 API 키 인증 및 OAuth2 인증을 비롯한 여러 인증 방법을 지원하며, AWS Secrets Manager에 저장된 보안 암호를 사용하여 자격 증명을 관리하는 보안 기능이 추가되었습니다. 또한 중단 없는 액세스를 위한 자동 토큰 갱신 기능을 제공하여 지속적인 작업을 보장합니다. Atlassian의 [API 버전 2](https://developer.atlassian.com/cloud/jira/platform/rest/v2/intro/#version%22%3Eapi-version-2)를 기반으로 구축된 이 통합을 통해 팀은 OpenSearch의 고급 검색 기능을 통해 Jira 데이터에서 귀중한 인사이트를 얻을 수 있습니다.

------
#### [ Integrating with Confluence ]

Data Prepper의 Confluence 소스 플러그인을 통해 [Atlassian Confluence](https://www.atlassian.com/software/confluence) 콘텐츠를 OpenSearch에 통합하여 팀의 지식 관리 및 협업 기능을 개선합니다. 이 통합을 통해 검색 가능한 중앙 집중식 집단 지식 리포지토리를 생성하여 정보 검색과 팀 생산성을 개선할 수 있습니다. 이 플러그인은 Confluence 콘텐츠를 동기화하고 업데이트를 지속적으로 모니터링하여 OpenSearch 인덱스를 포괄적이고 최신의 상태로 유지합니다.

통합은 유연한 필터링 옵션을 제공하므로 특정 스페이스 또는 페이지 유형에서 콘텐츠를 선택적으로 가져와 조직의 니즈에 맞게 동기화된 콘텐츠를 조정할 수 있습니다. 이 플러그인은 기본 API 키와 OAuth2 인증 방법을 모두 지원하며, AWS Secrets Manager를 통해 자격 증명을 안전하게 관리할 수 있습니다. 플러그인의 자동 토큰 갱신 기능은 중단 없는 액세스와 원활한 운영을 보장합니다. Atlassian의 Confluence [API](https://developer.atlassian.com/cloud/confluence/rest/v1/intro/#auth)를 기반으로 구축된 이 통합을 통해 팀은 Confluence 콘텐츠에 OpenSearch의 고급 검색 기능을 활용하여 조직 내 정보 접근성과 활용도를 높일 수 있습니다.

------

**Topics**
+ [사전 조건](#atlassian-prerequisites)
+ [파이프라인 역할 구성](#atlassian-pipeline-role)
+ [Jira 커넥터 파이프라인 구성](#jira-connector-pipeline)
+ [Confluence 커넥터 파이프라인 구성](#confluence-connector-pipeline)
+ [데이터 일관성](#data-consistency)
+ [제한 사항](#limitations)
+ [Atlassian 커넥터에 대한 CloudWatch의 지표](#metrics)
+ [OAuth 2.0을 사용하여 Atlassian Jira 또는 Confluence에 Amazon OpenSearch Ingestion 파이프라인 연결](configure-client-atlassian-OAuth2-setup.md)

## 사전 조건
<a name="atlassian-prerequisites"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 완료합니다.

1. 다음 옵션 중 하나를 선택하여 Jira 사이트의 자격 증명을 준비합니다. OpenSearch Ingestion은 콘텐츠에 대한 `ReadOnly` 권한만 필요로 합니다.

   1. **옵션 1: API 키** - Atlassian 계정에 로그인하고 다음 주제의 정보를 사용하여 API 키를 생성합니다.
      + [Atlassian 계정의 API 토큰 관리](https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/)

   1. **옵션 2: OAuth2** - Atlassian 계정에 로그인하고 [OAuth 2.0을 사용하여 Atlassian Jira 또는 Confluence에 Amazon OpenSearch Ingestion 파이프라인 연결](configure-client-atlassian-OAuth2-setup.md)의 정보를 사용합니다.

1. 이전 단계에서 생성한 자격 증명을 저장할 [AWS Secrets Manager의 보안 암호](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) 를 생성합니다. 절차에 따라 다음을 선택합니다.
   + **보안 암호 유형**에서 **다른 유형의 보안 암호**를 선택합니다.
   + **키/값 페어**에서 선택한 권한 부여 유형에 따라 다음 페어를 생성합니다.

------
#### [ API key ]

   ```
   {
      "username": user-name-usualy-email-id,
      "password": api-key
   }
   ```

------
#### [ OAuth 2.0 ]

   ```
   {
      "clientId": client-id
      "clientSecret": client-secret
      "accessKey": access-key
      "refreshKey": refresh-key
   }
   ```

------

   보안 암호를 생성한 후 보안 암호의 Amazon 리소스 이름(ARN)을 복사합니다. 이 ARN을 파이프라인 역할 권한 정책에 포함하게 됩니다.

## 파이프라인 역할 구성
<a name="atlassian-pipeline-role"></a>

사전 조건 섹션에서 생성된 보안 암호를 읽고 쓰려면 파이프라인에 전달된 역할에 다음 정책이 연결되어 있어야 합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SecretReadWrite",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:PutSecretValue",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:secret-name-random-6-characters"
        }
    ]
}
```

------

이 역할에는 선택한 싱크에 액세스하고 쓸 수 있도록 하는 정책도 연결되어 있어야 합니다. 예를 들어 싱크로 OpenSearch를 선택하면 정책은 다음과 유사합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "OpenSearchWritePolicy",
            "Effect": "Allow",
            "Action": "aoss:*",
            "Resource": "arn:aws:aoss:us-east-1:111122223333:collection/collection-id"
        }
    ]
}
```

------

## Jira 커넥터 파이프라인 구성
<a name="jira-connector-pipeline"></a>

사전 구성된 Atlassian Jira 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

*자리 표시자*를 자신의 정보로 바꿉니다.

```
version: "2"
extension:
  aws:
    secrets:
      jira-account-credentials:
        secret_id: "secret-arn"
        region: "secret-region"
        sts_role_arn: "arn:aws:iam::123456789012:role/Example-Role"
atlassian-jira-pipeline:
  source:
    jira:
      # We only support one host url for now
      hosts: ["jira-host-url"]
      acknowledgments: true
      authentication:
        # Provide one of the authentication method to use. Supported methods are 'basic' and 'oauth2'.
        # For basic authentication, password is the API key that you generate using your jira account
        basic:
          username: ${{aws_secrets:jira-account-credentials:username}}
          password: ${{aws_secrets:jira-account-credentials:password}}
        # For OAuth2 based authentication, we require the following 4 key values stored in the secret
        # Follow atlassian instructions at the below link to generate these keys.
        # https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/
        # If you are using OAuth2 authentication, we also require, write permission to your AWS secret to
        # be able to write the renewed tokens back into the secret.
        # oauth2:
          # client_id: ${{aws_secrets:jira-account-credentials:clientId}}
          # client_secret: ${{aws_secrets:jira-account-credentials:clientSecret}}
          # access_token: ${{aws_secrets:jira-account-credentials:accessToken}}
          # refresh_token: ${{aws_secrets:jira-account-credentials:refreshToken}}
      filter:
        project:
          key:
            include:
              # This is not project name.
              # It is an alphanumeric project key that you can find under project details in Jira.
              - "project-key"
              - "project-key"
            # exclude:
              # - "project-key"
              # - "project-key"
        issue_type:
          include:
            - "issue-type"
            # - "Story"
            # - "Bug"
            # - "Task"
         # exclude:
             # - "Epic"
        status:
          include:
            - "ticket-status"
            # - "To Do"
            # - "In Progress"
            # - "Done"
         # exclude:
           # - "Backlog"

  sink:
    - opensearch:
        # Provide an Amazon OpenSearch Service domain endpoint
        hosts: [ "https://search-mydomain-1a2a3a4a5a6a7a8a9a0a9a8a7a.us-east-1.es.amazonaws.com" ]
        index: "index_${getMetadata(\"project\")}"
        # Ensure adding unique document id which is the unique ticket id in this case
        document_id: '${/id}'
        aws:
          # Provide a Role ARN with access to the domain. This role should have a trust relationship with osis-pipelines.amazonaws.com
          sts_role_arn: "arn:aws:iam::123456789012:role/Example-Role"
          # Provide the region of the domain.
          region: "us-east-1"
          # Enable the 'serverless' flag if the sink is an Amazon OpenSearch Serverless collection
          serverless: false
          # serverless_options:
            # Specify a name here to create or update network policy for the serverless collection
            # network_policy_name: "network-policy-name"
        # Enable the 'distribution_version' setting if the Amazon OpenSearch Service domain is of version Elasticsearch 6.x
        # distribution_version: "es6"
        # Enable and switch the 'enable_request_compression' flag if the default compression setting is changed in the domain. 
        # See Amazon OpenSearch Service에서 HTTP 요청 압축
        # enable_request_compression: true/false
        # Optional: Enable the S3 DLQ to capture any failed requests in an S3 bucket. Delete this entire block if you don't want a DLQ.
        dlq:
          s3:
            # Provide an S3 bucket
            bucket: "your-dlq-bucket-name"
            # Provide a key path prefix for the failed requests
            # key_path_prefix: "kinesis-pipeline/logs/dlq"
            # Provide the region of the bucket.
            region: "us-east-1"
            # Provide a Role ARN with access to the bucket. This role should have a trust relationship with osis-pipelines.amazonaws.com
            sts_role_arn: "arn:aws:iam::123456789012:role/Example-Role"
```

Jira 소스의 속성에 대한 키:

1. **hosts**: Jira 클라우드 또는 온프레미스 URL입니다. 일반적으로 `https://your-domain-name.atlassian.net/`과 같습니다.

1. **acknowledgments**: 싱크까지 데이터가 전송되도록 보장합니다.

1. **authentication**: 파이프라인이 Jira 인스턴스에 액세스하는 방법을 설명합니다. `Basic` 또는 `OAuth2`를 선택하고 AWS 보안 암호의 키를 참조하는 해당 키 속성을 지정합니다.

1. **filter**: 이 섹션에은 추출하고 동기화할 Jira 데이터 부분을 선택하는 데 도움이 됩니다.

   1. **project**: `include` 섹션에서 동기화하려는 프로젝트 키를 나열합니다. 그렇지 않으면 `exclude` 섹션에서 제외하려는 프로젝트를 나열합니다. 항상 포함 또는 제외 옵션 중 하나만 제공합니다.

   1. **issue\$1type**: 동기화하려는 특정 문제 유형입니다. 니즈에 맞는 유사한 `include` 또는 `exclude` 패턴을 따릅니다. 첨부 파일은 원래 첨부 파일에 대한 앵커 링크로 표시되지만 첨부 파일 콘텐츠는 추출되지 않습니다.

   1. **status**: 데이터 추출 쿼리에 적용할 특정 상태 필터입니다. `include`를 지정하면 해당 상태의 티켓만 동기화됩니다. `exclude`를 지정하면 제외된 상태가 나열된 티켓을 제외한 모든 티켓이 동기화됩니다.

## Confluence 커넥터 파이프라인 구성
<a name="confluence-connector-pipeline"></a>

사전 구성된 Atlassian Confluence 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

```
version: "2"
extension:
  aws:
    secrets:
      confluence-account-credentials:
        secret_id: "secret-arn"
        region: "secret-region"
        sts_role_arn: "arn:aws:iam::123456789012:role/Example-Role"
atlassian-confluence-pipeline:
  source:
    confluence:
      # We currently support only one host URL.
      hosts: ["confluence-host-url"]
      acknowledgments: true
      authentication:
        # Provide one of the authentication method to use. Supported methods are 'basic' and 'oauth2'.
        # For basic authentication, password is the API key that you generate using your Confluence account
        basic:
          username: ${{aws_secrets:confluence-account-credentials:confluenceId}}
          password: ${{aws_secrets:confluence-account-credentials:confluenceCredential}}
        # For OAuth2 based authentication, we require the following 4 key values stored in the secret
        # Follow atlassian instructions at the following link to generate these keys:
        # https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/
        # If you are using OAuth2 authentication, we also require write permission to your AWS secret to
        # be able to write the renewed tokens back into the secret.
        # oauth2:
          # client_id: ${{aws_secrets:confluence-account-credentials:clientId}}
          # client_secret: ${{aws_secrets:confluence-account-credentials:clientSecret}}
          # access_token: ${{aws_secrets:confluence-account-credentials:accessToken}}
          # refresh_token: ${{aws_secrets:confluence-account-credentials:refreshToken}}
      filter:
        space:
          key:
            include:
              # This is not space name.
              # It is a space key that you can find under space details in Confluence.
              - "space key"
              - "space key"
           # exclude:
             #  - "space key"
             #  - "space key"
        page_type:
          include:
            - "content type"
            # - "page"
            # - "blogpost"
            # - "comment"
         # exclude:
            # - "attachment"

  sink:
    - opensearch:
        # Provide an Amazon OpenSearch Service domain endpoint
        hosts: [ "https://search-mydomain-1a2a3a4a5a6a7a8a9a0a9a8a7a.us-east-1.es.amazonaws.com" ]
         index: "index_${getMetadata(\"space\")}"
        # Ensure adding unique document id which is the unique ticket ID in this case.
        document_id: '${/id}'
        aws:
          # Provide the Amazon Resource Name (ARN) for a role with access to the domain. This role should have a trust relationship with osis-pipelines.amazonaws.com.
          sts_role_arn: "arn:aws:iam::123456789012:role/Example-Role"
          # Provide the Region of the domain.
          region: "us-east-1"
          # Enable the 'serverless' flag if the sink is an Amazon OpenSearch Serverless collection
          serverless: false
          # serverless_options:
            # Specify a name here to create or update network policy for the serverless collection.
            # network_policy_name: "network-policy-name"
        # Enable the 'distribution_version' setting if the Amazon OpenSearch Service domain is of version Elasticsearch 6.x
        # distribution_version: "es6"
        # Enable and switch the 'enable_request_compression' flag if the default compression setting is changed in the domain. 
        # For more information, see Amazon OpenSearch Service에서 HTTP 요청 압축.
        # enable_request_compression: true/false
        # Optional: Enable the S3 DLQ to capture any failed requests in an S3 bucket. Delete this entire block if you don't want a DLQ.
        dlq:
          s3:
            # Provide an S3 bucket
            bucket: "your-dlq-bucket-name"
            # Provide a key path prefix for the failed requests
            # key_path_prefix: "kinesis-pipeline/logs/dlq"
            # Provide the Rregion of the bucket.
            region: "us-east-1"
            # Provide the Amazon Resource Name (ARN) for a role with access to the bucket. This role should have a trust relationship with osis-pipelines.amazonaws.com
            sts_role_arn: "arn:aws:iam::123456789012:role/Example-Role"
```

Confluence 소스의 주요 속성:

1. **hosts**: Confluence 클라우드 또는 온프레미스 URL입니다. 일반적으로 `https://your-domain-name.atlassian.net/`과 같습니다.

1. **acknowledgments**: 싱크까지 데이터가 전송되도록 보장합니다.

1. **authentication**: 파이프라인이 Confluence 인스턴스에 액세스하는 방법을 설명합니다. `Basic` 또는 `OAuth2`를 선택하고 AWS 보안 암호의 키를 참조하는 해당 키 속성을 지정합니다.

1. **filter**: 이 섹션에은 추출하고 동기화할 Confluence 데이터 부분을 선택하는 데 도움이 됩니다.

   1. **space**: `include` 섹션에서 동기화하려는 스페이스 키를 나열합니다. 그렇지 않으면 `exclude` 섹션에서 제외하려는 스페이스를 나열합니다. 항상 포함 또는 제외 옵션 중 하나만 제공합니다.

   1. **page\$1type**: 동기화하려는 특정 페이지 유형(예: 페이지, 블로그 게시물 또는 첨부 파일)입니다. 니즈에 맞는 유사한 `include` 또는 `exclude` 패턴을 따릅니다. 첨부 파일은 원래 첨부 파일에 대한 앵커 링크로 표시되지만 첨부 파일 콘텐츠는 추출되지 않습니다.

## 데이터 일관성
<a name="data-consistency"></a>

파이프라인 YAML에 지정된 필터를 기반으로 선택한 프로젝트(또는 공백)가 한 번 추출되고 대상 싱크에 완전히 동기화됩니다. 그런 다음 지속적인 변경 모니터링을 통해 변경 사항이 발생할 때 이를 캡처하고 싱크의 데이터를 업데이트합니다. 한 가지 예외는 변경 모니터링이 `create` 및 `update` 작업만 동기화하고 `delete` 작업은 동기화하지 않는다는 것입니다.

## 제한 사항
<a name="limitations"></a>
+ 사용자 삭제 작업은 동기화되지 않습니다. 싱크에 기록된 데이터는 싱크에 남아 있습니다. ID 매핑이 싱크 설정에 지정된 경우 업데이트는 기존 콘텐츠를 새 변경 사항으로 덮어씁니다.
+ 다음 API를 지원하지 않는 이전 버전의 Atlassian 소프트웨어를 사용하는 온프레미스 인스턴스는 이 소스와 호환되지 않습니다.
  + Jira Search API 버전 3
    + `rest/api/3/search`
    + `rest/api/3/issue`
  + Confluence
    + `wiki/rest/api/content/search`
    + `wiki/rest/api/content`
    + `wiki/rest/api/settings/systemInfo`

## Atlassian 커넥터에 대한 CloudWatch의 지표
<a name="metrics"></a>

**유형: Jira 커넥터 지표**


| 소스 | 지표 | 지표 유형 | 
| --- | --- | --- | 
| acknowledgementSetSuccesses.count | Counter | 승인이 활성화된 경우 이 지표는 성공적으로 동기화된 티켓 수를 제공합니다. | 
| acknowledgementSetFailures.count | Counter | 승인이 활성화된 경우 이 지표는 동기화에 실패한 티켓 수를 제공합니다. | 
| crawlingTime.avg | 타이머 | 모든 새 변경 사항을 크롤링하는 데 걸린 시간입니다. | 
| ticketFetchLatency.avg | 타이머 | 이 티켓은 평균 API 지연 시간을 가져옵니다. | 
| ticketFetchLatency.max | 타이머 | 이 티켓은 최대 API 지연 시간을 가져옵니다. | 
| ticketsRequested.count | Counter | 수행된 티켓 가져오기 요청 수입니다. | 
| ticketRequestedFailed.count | Counter | 실패한 티켓 가져오기 요청 수입니다. | 
| ticketRequestedSuccess.count | Counter | 성공한 티켓 가져오기 요청 수입니다. | 
| searchCallLatency.avg | 타이머 | 평균 API 호출 지연 시간을 검색합니다. | 
| searchCallLatency.max | 타이머 | 최대 API 호출 지연 시간을 검색합니다. | 
| searchResultsFound.count | Counter | 해당 검색 직접 호출에서 발견된 항목 수입니다. | 
| searchRequestFailed.count | Counter | 검색 API 직접 호출 실패 횟수입니다. | 
| authFailures.count | Counter | 인증 실패 횟수입니다. | 

**유형: Confluence 커넥터 지표**


| 소스 | 지표 | 지표 유형 | 
| --- | --- | --- | 
| acknowledgementSetSuccesses.count | Counter | 승인이 활성화된 경우 이 지표는 성공적으로 동기화된 페이지 수를 제공합니다. | 
| acknowledgementSetFailures.count | Counter | 승인이 활성화된 경우 이 지표는 동기화에 실패한 페이지 수를 제공합니다. | 
| crawlingTime.avg | 타이머 | 모든 새 변경 사항을 크롤링하는 데 걸린 시간입니다. | 
| pageFetchLatency.avg | 타이머 | 콘텐츠 가져오기 API 지연 시간(평균)입니다. | 
| pageFetchLatency.max | 타이머 | 콘텐츠 가져오기 API 지연 시간(최대)입니다. | 
| pagesRequested.count | Counter | API를 가져오는 콘텐츠의 간접 호출 횟수입니다. | 
| pageRequestFailed.count | Counter | 콘텐츠 가져오기 API의 실패한 요청 수입니다. | 
| pageRequestedSuccess.count | Counter | 콘텐츠 가져오기 API의 성공한 요청 수입니다. | 
| searchCallLatency.avg | 타이머 | 평균 API 호출 지연 시간을 검색합니다. | 
| searchCallLatency.max | 타이머 | 최대 검색 API 호출 지연 시간입니다. | 
| searchResultsFound.count | Counter | 해당 검색 직접 호출에서 발견된 항목 수입니다. | 
| searchRequestsFailed.count | Counter | 검색 API 직접 호출 실패 횟수입니다. | 
| authFailures.count | Counter | 인증 실패 횟수입니다. | 

# OAuth 2.0을 사용하여 Atlassian Jira 또는 Confluence에 Amazon OpenSearch Ingestion 파이프라인 연결
<a name="configure-client-atlassian-OAuth2-setup"></a>

이 주제의 정보를 참조하면 OAuth 2.0 인증을 사용하여 Amazon OpenSearch Ingestion 파이프라인을 구성하고 Jira 또는 Confluence 계정에 연결하는 데 도움이 됩니다. 이 Atlassian Services에서 OpenSearch Ingestion 파이프라인을 사용하기 위해 [사전 조건](configure-client-atlassian.md#atlassian-prerequisites)를 완료하는 경우 이 작업을 수행하되 API 키 자격 증명을 사용하지 않도록 선택합니다.

**Topics**
+ [OAuth 2.0 통합 앱 생성](#create-OAuth2-integration-app)
+ [Atlassian Developer 액세스 토큰 생성 및 새로 고침](#generate-and-refresh-jira-access-token)

## OAuth 2.0 통합 앱 생성
<a name="create-OAuth2-integration-app"></a>

다음 절차에 따라 Atlassian Developer 웹 사이트에서 OAuth 2.0 통합 앱을 생성합니다.

**OAuth 2.0 통합 앱을 생성하려면**

1. [https://developer.atlassian.com/console/myapps/](https://developer.atlassian.com/console/myapps/)에서 Atlassian Developer 계정에 로그인합니다.

1. **생성**, **OAuth 2.0 통합**을 선택합니다.

1. **이름**에 앱의 용도를 식별할 수 있는 이름을 입력합니다.

1. **Atlassian의 개발자 약관을 준수하는 데 동의합니다** 확인란을 선택하고 **생성**을 선택합니다.

1. 왼쪽 탐색 창에서 **권한 부여**를 선택한 다음 **추가**를 선택합니다.

1. **콜백 URL**에 **https://www.amazon.com** 또는 **https://www.example.com**과 같은 URL을 입력한 다음 **변경 사항 저장**을 선택합니다.

1. 왼쪽 탐색 메뉴에서 **권한** 페이지를 선택하고 Jira API 행에서 **추가**를 선택한 후 **구성**을 선택하고 모든 클래식 범위 읽기 권한(아래에 나와 있음)을 선택한 다음 저장을 선택합니다.

1. **세분화된 범위** 탭을 선택한 다음 **범위 편집**을 선택하여 **Jira API 편집** 대화 상자를 엽니다.

1. 사용 중인 소스 플러그인에 대한 권한을 선택합니다.

------
#### [ Jira ]

   ```
   read:audit-log:jira
   read:issue:jira
   read:issue-meta:jira
   read:attachment:jira
   read:comment:jira
   read:comment.property:jira
   read:field:jira
   read:field.default-value:jira
   read:field.option:jira
   read:field-configuration-scheme:jira
   read:field-configuration:jira
   read:issue-link:jira
   read:issue-link-type:jira
   read:issue-link-type:jira
   read:issue.remote-link:jira
   read:issue.property:jira
   read:resolution:jira
   read:issue-details:jira
   read:issue-type:jira
   read:issue-worklog:jira
   read:issue-field-values:jira
   read:issue.changelog:jira
   read:issue.transition:jira
   read:issue.vote:jira
   read:jira-expressions:jira
   ```

------
#### [ Confluence ]

   ```
   read:content:confluence
   read:content-details:confluence
   read:space-details:confluence
   read:audit-log:confluence
   read:page:confluence
   read:blogpost:confluence
   read:custom-content:confluence
   read:comment:confluence
   read:space:confluence
   read:space.property:confluence
   read:space.setting:confluence
   read:content.property:confluence
   read:content.metadata:confluence
   read:task:confluence
   read:whiteboard:confluence
   read:app-data:confluence
   manage:confluence-configuration
   ```

------

1. **저장**을 선택합니다.

자세한 내용은 Atlassian Developer 웹 사이트에서 [Implementing OAuth 2.0 (3LO)](https://developer.atlassian.com/cloud/oauth/getting-started/implementing-oauth-3lo/) 및 [Determining the scopes required for an operation](https://developer.atlassian.com/cloud/oauth/getting-started/determining-scopes/)을 참조하세요.

## Atlassian Developer 액세스 토큰 생성 및 새로 고침
<a name="generate-and-refresh-jira-access-token"></a>

다음 절차를 참조하면 Atlassian Developer 웹 사이트에서 Atlassian Developer 액세스 토큰을 생성하고 새로 고치는 데 도움이 됩니다.

**Jira 액세스 토큰을 생성하고 새로 고치려면**

1. [https://developer.atlassian.com/console/myapps/](https://developer.atlassian.com/console/myapps/)에서 Atlassian Developer 계정에 로그인합니다.

1. [OAuth 2.0 통합 앱 생성](#create-OAuth2-integration-app)에서 생성한 앱을 선택합니다.

1. 왼쪽 탐색 메뉴에서 **권한 부여**를 선택합니다.

1. 페이지 하단에서 세분화된 Atlassian API 권한 부여 URL 값을 복사하여 원하는 텍스트 편집기에 붙여 넣습니다.

   URL의 형식은 다음과 같습니다.

   ```
   https://auth.atlassian.com/authorize?
   audience=api.atlassian.com 
   &client_id=YOUR_CLIENT_ID
   &scope=REQUESTED_SCOPE%20REQUESTED_SCOPE_TWO
   &redirect_uri=https://YOUR_APP_CALLBACK_URL
   &state=YOUR_USER_BOUND_VALUE 
   &response_type=code
   &prompt=consent
   ```

1. `state=YOUR_USER_BOUND_VALUE`의 파라미터 값을 state="**sample\$1text**"와 같이 선택한 항목으로 변경합니다.

   자세한 내용은 Atlassian Developer 웹 사이트의 [What is the state parameter used for?](https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/#what-is-the-state-parameter-used-for-)를 참조하세요.

1. `scope` 섹션에는 이전 작업에서 선택한 세분화된 범위가 나열됩니다. 예: `scope=read%3Ajira-work%20read%3Ajira-user%20offline_access`

   `offline_access`는 `refresh_token`을 생성하고자 함을 나타냅니다.

1. 웹 브라우저 창을 열고 복사한 권한 부여 URL을 브라우저 창의 주소 표시줄에 입력합니다.

1. 대상 페이지가 열리면 정보가 올바른지 확인한 다음 **수락**을 선택하여 Jira 또는 Confluence 홈 페이지로 리디렉션합니다.

1. 홈 페이지를 로드한 후 이 페이지의 URL을 복사합니다. 이 URL에는 애플리케이션의 권한 부여 코드가 포함되어 있습니다. 이 코드를 사용하여 액세스 토큰을 생성하게 됩니다. `code=` 다음의 섹션 전체가 권한 부여 코드입니다.

1. 다음 cURL 명령을 사용하여 액세스 토큰을 생성합니다. *자리 표시자*를 자신의 정보로 바꿉니다.
**작은 정보**  
Postman과 같은 서드 파티 서비스를 사용할 수도 있습니다.

   ```
   curl --request POST --url 'https://auth.atlassian.com/oauth/token' \
   --header 'Content-Type: application/json' \
   --data '{"grant_type": "authorization_code",
   "client_id": "YOUR_CLIENT_ID",
   "client_secret": "YOUR_CLIENT_SECRET",
   "code": "AUTHORIZATION_CODE",
   "redirect_uri": "YOUR_CALLBACK_URL"}'
   ```

   이 명령에 대한 응답에는 `access_code` 및 `refresh_token` 값이 포함됩니다.

# Amazon Aurora에서 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-aurora"></a>

Amazon Aurora와 함께 OpenSearch Ingestion 파이프라인을 사용하여 기존 데이터를 내보내고 변경 사항(예: 생성, 업데이트 및 삭제)을 Amazon OpenSearch Service 도메인 및 컬렉션으로 스트리밍할 수 있습니다. OpenSearch Ingestion 파이프라인은 변경 데이터 캡처(CDC) 인프라를 통합하여 지연 시간을 최소화하면서 대규모로 Amazon Aurora에서 데이터를 지속적으로 스트리밍할 수 있도록 합니다. Aurora MySQL과 Aurora PostgreSQL을 지원되지 않습니다.

Amazon Aurora를 데이터 처리를 위한 소스로 사용하는 두 가지 방법(전체 초기 스냅샷 사용 또는 사용 안 함)이 있습니다. 전체 초기 스냅샷은 지정된 테이블의 스냅샷이며, 이 스냅샷은 Amazon S3로 내보내집니다. 그러면 OpenSearch Ingestion 파이프라인이 이 스냅샷을 도메인의 한 인덱스로 보내거나 분할하여 도메인의 여러 인덱스로 보냅니다. Amazon Aurora와 OpenSearch의 데이터를 일관되게 유지하기 위해 파이프라인에서는 Amazon Aurora 클러스터의 테이블에 있는 모든 생성, 업데이트 및 삭제 이벤트를 하나 이상의 OpenSearch 인덱스에 저장된 문서와 동기화합니다.

전체 초기 스냅샷을 사용하는 경우 OpenSearch Ingestion 파이프라인에서는 먼저 스냅샷을 수집한 다음, Amazon Aurora 변경 스트림에서 데이터를 읽기 시작합니다. 실제로 처리의 시간 차이가 거의 없기 때문에 Amazon Aurora와 OpenSearch 간에 실시간에 가까운 데이터 일관성이 유지됩니다.

또한 Amazon Aurora와의 OpenSearch Ingestion 통합을 사용하여 변경 데이터 캡처를 추적하고 Aurora에서 OpenSearch로의 모든 업데이트를 수집할 수 있습니다. 다른 메커니즘의 전체 스냅샷이 이미 있거나 Amazon Aurora 클러스터의 데이터에 대한 모든 변경 사항을 캡처하려는 경우 이 옵션을 선택합니다.

이 옵션을 선택하면 [Aurora MySQL에 대한 이진 로깅을 구성](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_LogAccess.MySQL.BinaryFormat.html)하거나 [클러스터에서 Aurora PostgreSQL에 대한 논리적 복제를 설정](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Replication.Logical.Configure.html)해야 합니다.

**Topics**
+ [Aurora MySQL](aurora-mysql.md)
+ [Aurora PostgreSQL](aurora-PostgreSQL.md)

# Aurora MySQL
<a name="aurora-mysql"></a>

Amazon Aurora for Aurora MySQL을 사용하여 OpenSearch Ingestion 파이프라인을 구성하려면 다음 단계를 완료합니다.

**Topics**
+ [Aurora MySQL 사전 조건](#aurora-mysql-prereqs)
+ [1단계: 파이프라인 역할 구성](#aurora-mysql-pipeline-role)
+ [2단계: 파이프라인 생성](#aurora-mysql-pipeline)
+ [데이터 일관성](#aurora-mysql-pipeline-consistency)
+ [데이터 형식 매핑](#aurora-mysql-pipeline-mapping)
+ [제한 사항](#aurora-mysql-pipeline-limitations)
+ [권장되는 CloudWatch 경보](#aurora-mysql-pipeline-metrics)

## Aurora MySQL 사전 조건
<a name="aurora-mysql-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. [Amazon Aurora에서 사용자 지정 Aurora DB 클러스터 파라미터 그룹을 생성하여 바이너리 로깅을 구성합니다](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/zero-etl.setting-up.html#zero-etl.parameters).

   ```
   aurora_enhanced_binlog=1
   binlog_backup=0
   binlog_format=ROW
   binlog_replication_globaldb=0
   binlog_row_image=full
   binlog_row_metadata=full
   ```

   또한 `binlog_transaction_compression` 파라미터가 `ON`으로 설정되어 있지 않고 `binlog_row_value_options` 파라미터가 `PARTIAL_JSON`으로 설정되어 있지 않아야 합니다.

1. [Aurora MySQL DB 클러스터를 선택하거나 생성하고](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.Aurora.html) 이전 단계에서 생성한 파라미터 그룹을 DB 클러스터와 연결합니다.

1. [바이너리 로그 보존을 24시간 이상으로 구성합니다](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/mysql-stored-proc-configuring.html).

1. [Aurora 및 AWS Secrets Manager에서 암호 관리를 사용](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html)하여 Amazon Aurora 클러스터에서 사용자 이름과 암호 인증을 설정합니다. [Secrets Manager 보안 암호를 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)하여 사용자 이름/암호 조합을 생성할 수도 있습니다.

1. 전체 초기 스냅샷 기능을 사용하는 경우 Amazon Aurora에서 Amazon S3로 데이터를 내보내기 위한 AWS KMS key 및 IAM 역할을 생성합니다.

   이 IAM 역할에는 다음과 같은 권한 정책도 있어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ExportPolicy",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject*",
                   "s3:ListBucket",
                   "s3:GetObject*",
                   "s3:DeleteObject*",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::s3-bucket-used-in-pipeline",
                   "arn:aws:s3:::s3-bucket-used-in-pipeline/*"
               ]
           }
       ]
   }
   ```

------

   이 역할에는 다음과 같은 신뢰 관계도 있어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "export.rds.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 선택하거나 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains) 및 [컬렉션 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html#serverless-create)을 참조하세요.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 Amazon Aurora DB 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

## 1단계: 파이프라인 역할 구성
<a name="aurora-mysql-pipeline-role"></a>

Amazon Aurora 파이프라인 사전 조건을 설정한 후 [파이프라인 구성에 사용할 파이프라인 역할을 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-sink)합니다. 또한 Amazon Aurora 소스에 대한 다음 권한을 역할에 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
    "Sid": "allowReadingFromS3Buckets",
    "Effect": "Allow",
    "Action": [
    "s3:GetObject",
    "s3:DeleteObject",
    "s3:GetBucketLocation",
    "s3:ListBucket",
    "s3:PutObject"
    ],
    "Resource": [
    "arn:aws:s3:::s3_bucket",
    "arn:aws:s3:::s3_bucket/*"
    ]
    },
    {
    "Sid": "allowNetworkInterfacesActions",
    "Effect": "Allow",
    "Action": [
    "ec2:AttachNetworkInterface",
    "ec2:CreateNetworkInterface",
    "ec2:CreateNetworkInterfacePermission",
    "ec2:DeleteNetworkInterface",
    "ec2:DeleteNetworkInterfacePermission",
    "ec2:DetachNetworkInterface",
    "ec2:DescribeNetworkInterfaces"
    ],
    "Resource": [
    "arn:aws:ec2:*:111122223333:network-interface/*",
    "arn:aws:ec2:*:111122223333:subnet/*",
    "arn:aws:ec2:*:111122223333:security-group/*"
    ]
    },
    {
    "Sid": "allowDescribeEC2",
    "Effect": "Allow",
    "Action": [
    "ec2:Describe*"
    ],
    "Resource": "*"
    },
    {
    "Sid": "allowTagCreation",
    "Effect": "Allow",
    "Action": [
    "ec2:CreateTags"
    ],
    "Resource": "arn:aws:ec2:*:111122223333:network-interface/*",
    "Condition": {
    "StringEquals": {
    "aws:RequestTag/OSISManaged": "true"
    }
    }
    },
    {
    "Sid": "AllowDescribeInstances",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBInstances"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:db:*"
    ]
    },
    {
    "Sid": "AllowDescribeClusters",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBClusters"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:cluster:DB-id"
    ]
    },
    {
    "Sid": "AllowSnapshots",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBClusterSnapshots",
    "rds:CreateDBClusterSnapshot",
    "rds:AddTagsToResource"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:cluster:DB-id",
    "arn:aws:rds:us-east-2:111122223333:cluster-snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowExport",
    "Effect": "Allow",
    "Action": [
    "rds:StartExportTask"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:cluster:DB-id",
    "arn:aws:rds:us-east-2:111122223333:cluster-snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowDescribeExports",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeExportTasks"
    ],
    "Resource": "*",
    "Condition": {
    "StringEquals": {
    "aws:RequestedRegion": "us-east-2",
    "aws:ResourceAccount": "111122223333"
    }
    }
    },
    {
    "Sid": "AllowAccessToKmsForExport",
    "Effect": "Allow",
    "Action": [
    "kms:Decrypt",
    "kms:Encrypt",
    "kms:DescribeKey",
    "kms:RetireGrant",
    "kms:CreateGrant",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*"
    ],
    "Resource": [
    "arn:aws:kms:us-east-2:111122223333:key/export-key-id"
    ]
    },
    {
    "Sid": "AllowPassingExportRole",
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": [
    "arn:aws:iam::111122223333:role/export-role"
    ]
    },
    {
    "Sid": "SecretsManagerReadAccess",
    "Effect": "Allow",
    "Action": [
    "secretsmanager:GetSecretValue"
    ],
    "Resource": [
    "arn:aws:secretsmanager:*:111122223333:secret:*"
    ]
    }
    ]
    }
```

------

## 2단계: 파이프라인 생성
<a name="aurora-mysql-pipeline"></a>

다음과 유사한 OpenSearch Ingestion 파이프라인을 구성합니다. 이 파이프라인 예는 Amazon Aurora 클러스터를 소스로 지정합니다.

```
version: "2"
aurora-mysql-pipeline:
  source:
    rds:
      db_identifier: "cluster-id"
      engine: aurora-mysql
      database: "database-name"
      tables:
        include:
          - "table1"
          - "table2"
      s3_bucket: "bucket-name"
      s3_region: "bucket-region"
      s3_prefix: "prefix-name"
      export:
        kms_key_id: "kms-key-id"
        iam_role_arn: "export-role-arn"
      stream: true
      aws:
        sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
        region: "us-east-1"
      authentication:
        username: ${{aws_secrets:secret:username}}
        password: ${{aws_secrets:secret:password}}
  sink:
    - opensearch:
        hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
        index: "${getMetadata(\"table_name\")}"
        index_type: custom
        document_id: "${getMetadata(\"primary_key\")}"
        action: "${getMetadata(\"opensearch_action\")}"
        document_version: "${getMetadata(\"document_version\")}"
        document_version_type: "external"
        aws:
          sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
          region: "us-east-1"
extension:
  aws:
    secrets:
      secret:
        secret_id: "rds-secret-id"
        region: "us-east-1"
        sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
        refresh_interval: PT1H
```

사전 구성된 Amazon Aurora 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

Amazon Aurora를 소스로 사용하려면 파이프라인에 대한 VPC 액세스를 구성해야 합니다. 선택한 VPC는 Amazon Aurora 소스에서 사용하는 것과 동일한 VPC여야 합니다. 그런 다음 하나 이상의 서브넷과 하나 이상의 VPC 보안 그룹을 선택합니다. 파이프라인에는 Aurora MySQL 데이터베이스에 대한 네트워크 액세스가 필요하므로 Aurora 클러스터가 파이프라인의 VPC 보안 그룹에서 데이터베이스 포트로의 인바운드 트래픽을 허용하는 VPC 보안 그룹으로 구성되어 있는지도 확인해야 합니다. 자세한 내용은 [보안 그룹을 통한 액세스 제어](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Overview.RDSSecurityGroups.html)를 참조하세요.

를 사용하여 파이프라인 AWS Management Console 을 생성하는 경우 Amazon Aurora를 소스로 사용하려면 VPC에 파이프라인도 연결해야 합니다. 이를 수행하려면 **네트워크 구성** 섹션을 찾아 **VPC에 연결** 확인란을 선택하고 제공된 기본 옵션 중 하나에서 CIDR을 선택하거나 직접 선택합니다. [RFC 1918 Best Current Practice](https://datatracker.ietf.org/doc/html/rfc1918)에 정의된 대로 프라이빗 주소 공간에서 모든 CIDR을 사용할 수 있습니다.

사용자 지정 CIDR을 제공하려면 드롭다운 메뉴에서 **기타**를 선택합니다. OpenSearch Ingestion과 Amazon Aurora 간의 IP 주소 충돌을 방지하려면 Amazon Aurora VPC CIDR이 OpenSearch Ingestion의 CIDR과 달라야 합니다.

자세한 내용은 [파이프라인에 대한 VPC 액세스 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security.html#pipeline-vpc-configure)을 참조하세요.

## 데이터 일관성
<a name="aurora-mysql-pipeline-consistency"></a>

파이프라인은 Amazon Aurora 클러스터의 변경 사항을 지속적으로 폴링하거나 수신하고 OpenSearch 인덱스에서 해당 문서를 업데이트하여 데이터 일관성을 보장합니다.

OpenSearch Ingestion은 데이터 내구성을 보장하는 엔드 투 엔드 승인을 지원합니다. 파이프라인에서는 스냅샷이나 스트림을 읽을 때 병렬 처리를 위해 동적으로 분할을 생성합니다. 파이프라인에서는 OpenSearch 도메인이나 컬렉션에서 모든 레코드를 수집한 후 승인을 받으면 분할을 완료 상태로 표시합니다. OpenSearch Serverless 검색 컬렉션에 수집하려는 경우 파이프라인에서 문서 ID를 생성할 수 있습니다. OpenSearch Serverless 시계열 컬렉션에 수집하려면 파이프라인이 문서 ID를 생성하지 않으므로 파이프라인 싱크 구성`document_id: "${getMetadata(\"primary_key\")}"`에서를 생략해야 합니다.

또한 OpenSearch Ingestion 파이프라인에서는 수신 이벤트 작업을 해당하는 대량 인덱싱 작업에 매핑하여 문서를 쉽게 수집할 수 있게 합니다. 이렇게 하면 데이터 일관성이 유지되므로 Amazon Aurora의 모든 데이터 변경 사항이 OpenSearch에서 해당하는 문서 변경 사항으로 조정됩니다.

## 데이터 형식 매핑
<a name="aurora-mysql-pipeline-mapping"></a>

OpenSearch Ingestion 파이프라인은 OpenSearch Service 도메인 또는 컬렉션이 사용할 수 있는 표현에 MySQL 데이터 유형을 매핑합니다. OpenSearch에 매핑 템플릿이 정의되지 않은 경우 OpenSearch는 처음 전송된 문서를 기반으로 [동적 매핑](https://opensearch.org/docs/latest/field-types/#dynamic-mapping)을 사용하여 필드 유형을 자동으로 결정합니다. 매핑 템플릿을 통해 OpenSearch에서 가장 적합한 필드 유형을 명시적으로 정의할 수도 있습니다.

아래 표에는 MySQL 데이터 유형과 해당 OpenSearch 필드 유형이 나열되어 있습니다. 명시적 매핑이 정의되지 않은 경우 *기본 OpenSearch 필드 유형* 열에 OpenSearch의 해당 필드 유형이 표시됩니다. 이 경우 OpenSearch는 동적 매핑을 사용하여 필드 유형을 자동으로 결정합니다. *권장 OpenSearch 필드 유형* 열은 매핑 템플릿에서 명시적으로 지정하도록 권장되는 해당 필드 유형입니다. 이들 필드 유형은 MySQL의 데이터 유형과 더 긴밀하게 맞춤화되며 일반적으로 OpenSearch에서 사용할 수 있는 더 나은 검색 기능을 지원할 수 있습니다.


| MySQL 데이터 형식 | 기본 OpenSearch 필드 유형 | 권장 OpenSearch 필드 유형 | 
| --- | --- | --- | 
| BIGINT | long | long | 
| BIGINT UNSIGNED | long | unsigned long | 
| BIT | long | 비트 수에 따라 byte, short, integer 또는 long입니다. | 
| DECIMAL | 텍스트 | double 또는 키워드 | 
| DOUBLE | 실수 | double | 
| FLOAT | 실수 | 실수 | 
| INT | long | 정수 | 
| INT UNSIGNED | long | long | 
| MEDIUMINT | long | 정수 | 
| MEDIUMINT UNSIGNED | long | 정수 | 
| NUMERIC | 텍스트 | double 또는 키워드 | 
| SMALLINT | long | bigint | 
| SMALLINT UNSIGNED | long | 정수 | 
| TINYINT | long | 바이트 | 
| TINYINT UNSIGNED | long | bigint | 
| BINARY | 텍스트 | 이진수 | 
| BLOB | 텍스트 | 이진수 | 
| CHAR | 텍스트 | 텍스트 | 
| ENUM | 텍스트 | 키워드 | 
| LONGBLOB | 텍스트 | 이진수 | 
| LONGTEXT | 텍스트 | 텍스트 | 
| MEDIUMBLOB | 텍스트 | 이진수 | 
| MEDIUMTEXT | 텍스트 | 텍스트 | 
| SET | 텍스트 | 키워드 | 
| TEXT | 텍스트 | 텍스트 | 
| TINYBLOB | 텍스트 | 이진수 | 
| TINYTEXT | 텍스트 | 텍스트 | 
| VARBINARY | 텍스트 | 이진수 | 
| VARCHAR | 텍스트 | 텍스트 | 
| DATE | long(에포크 밀리초) | 날짜 | 
| DATETIME | long(에포크 밀리초) | 날짜 | 
| TIME | long(에포크 밀리초) | 날짜 | 
| TIMESTAMP | long(에포크 밀리초) | 날짜 | 
| YEAR | long(에포크 밀리초) | 날짜 | 
| GEOMETRY | text(WKT 형식) | geo\$1shape | 
| GEOMETRYCOLLECTION | text(WKT 형식) | geo\$1shape | 
| LINESTRING | text(WKT 형식) | geo\$1shape | 
| MULTILINESTRING | text(WKT 형식) | geo\$1shape | 
| MULTIPOINT | text(WKT 형식) | geo\$1shape | 
| MULTIPOLYGON | text(WKT 형식) | geo\$1shape | 
| POINT | text(WKT 형식) | geo\$1point 또는 geo\$1shape | 
| POLYGON | text(WKT 형식) | geo\$1shape | 
| JSON | 텍스트 | 객체 | 

OpenSearch Ingestion 파이프라인에서 DLQ(Dead Letter Queue)를 구성하는 것이 좋습니다. 이 대기열을 구성하면 OpenSearch Service에서는 동적 매핑 실패로 인해 수집할 수 없는 모든 실패한 문서를 대기열로 전송합니다.

자동 매핑이 실패하면 파이프라인 구성에서 `template_type` 및 `template_content`를 사용하여 명시적 매핑 규칙을 정의할 수 있습니다. 또는 파이프라인을 시작하기 전에 검색 도메인이나 컬렉션에서 직접 매핑 템플릿을 생성할 수도 있습니다.

## 제한 사항
<a name="aurora-mysql-pipeline-limitations"></a>

Aurora MySQL용 OpenSearch Ingestion 파이프라인을 설정하는 경우 다음과 같은 제한 사항을 고려하세요.
+ 이 통합에서는 파이프라인당 하나의 MySQL 데이터베이스만 지원합니다.
+ 이 통합에서는 현재 교차 리전 데이터 수집을 지원하지 않습니다. Amazon Aurora 클러스터와 OpenSearch 도메인은 동일한 AWS 리전에 있어야 합니다.
+ 이 통합에서는 현재 교차 계정 데이터 수집을 지원하지 않습니다. Amazon Aurora 클러스터와 OpenSearch Ingestion 파이프라인은 동일한 AWS 계정에 있어야 합니다.
+ 지원되는 유일한 인증 메커니즘인 Secrets Manager를 사용한 인증이 Amazon Aurora 클러스터에 활성화되어 있는지 확인합니다.
+ 기존 파이프라인 구성은 다른 데이터베이스 및/또는 다른 테이블에서 데이터를 수집하도록 업데이트할 수 없습니다. 파이프라인의 데이터베이스 및/또는 테이블 이름을 업데이트하려면 파이프라인을 중지하고 업데이트된 구성으로 다시 시작하거나 새 파이프라인을 생성해야 합니다.
+ 데이터 정의 언어(DDL) 문은 일반적으로 지원되지 않습니다. 다음의 경우에는 데이터 일관성이 유지되지 않습니다.
  + 기본 키가 변경될 경우(추가/삭제/이름 변경)
  + 테이블이 삭제되거나 잘린 경우.
  + 열 이름 또는 데이터 형식이 변경된 경우.
+ 동기화할 MySQL 테이블에 기본 키가 정의되지 않은 경우 데이터 일관성이 보장되지 않습니다. 업데이트/삭제를 OpenSearch에 동기화하려면 OpenSearch 싱크 구성에서 사용자 지정 `document_id` 옵션을 올바르게 정의해야 합니다.
+ 계단식 삭제 작업이 있는 외래 키 참조는 지원되지 않으며, Aurora MySQL과 OpenSearch 간에 데이터 불일치가 발생할 수 있습니다.
+ 지원되는 버전: Aurora MySQL 버전 3.05.25 이상

## 권장되는 CloudWatch 경보
<a name="aurora-mysql-pipeline-metrics"></a>

수집 파이프라인의 성능을 모니터링하려면 다음 CloudWatch 지표가 권장됩니다. 이러한 지표는 내보내기에서 처리된 데이터의 양, 스트림에서 처리된 이벤트의 수, 내보내기 및 스트림 이벤트 처리 오류, 대상에 쓴 문서 수를 식별하는 데 도움이 될 수 있습니다. 이러한 지표 중 하나가 지정된 시간 동안 지정된 값을 초과하면 작업을 수행하도록 CloudWatch 경보를 설정할 수 있습니다.


| 지표 | 설명 | 
| --- | --- | 
| pipeline-name.rds.credentialsChanged | 이 지표는 AWS 보안 암호 교체 빈도를 나타냅니다. | 
| pipeline-name.rds.executorRefreshErrors | 이 지표는 AWS 보안 암호 새로 고침 실패를 나타냅니다. | 
| pipeline-name.rds.exportRecordsTotal | 이 지표는 Amazon Aurora에서 내보낸 레코드 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 레코드 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordProcessingErrors | 이 지표는 Amazon Aurora 클러스터에서 데이터를 읽는 동안 OpenSearch Ingestion 파이프라인에서 처리한 오류 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsSuccessTotal | 이 지표는 성공적으로 처리한 내보내기 레코드의 총 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsFailedTotal | 이 지표는 처리하지 못한 내보내기 레코드의 총 수를 나타냅니다. | 
| pipeline-name.rds.bytesReceived | 이 지표는 OpenSearch Ingestion 파이프라인에서 수신한 총 바이트 수를 나타냅니다. | 
| pipeline-name.rds.bytesProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 총 바이트 수를 나타냅니다. | 
| pipeline-name.rds.streamRecordsSuccessTotal | 이 지표는 스트림에서 성공적으로 처리한 레코드 수를 나타냅니다. | 
| pipeline-name.rds.streamRecordsFailedTotal | 이 지표는 스트림에서 처리하지 못한 총 레코드 수를 나타냅니다. | 

# Aurora PostgreSQL
<a name="aurora-PostgreSQL"></a>

Amazon Aurora for Aurora PostgreSQL을 사용하여 OpenSearch Ingestion 파이프라인을 구성하려면 다음 단계를 완료합니다.

**Topics**
+ [Aurora PostgreSQL 사전 조건](#aurora-PostgreSQL-prereqs)
+ [1단계: 파이프라인 역할 구성](#aurora-mysql-pipeline-role)
+ [2단계: 파이프라인 생성](#aurora-PostgreSQL-pipeline)
+ [데이터 일관성](#aurora-mysql-pipeline-consistency)
+ [데이터 형식 매핑](#aurora-PostgreSQL-pipeline-mapping)
+ [제한 사항](#aurora-PostgreSQL-pipeline-limitations)
+ [권장되는 CloudWatch 경보](#aurora-mysql-pipeline-metrics)

## Aurora PostgreSQL 사전 조건
<a name="aurora-PostgreSQL-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. Amazon Aurora에서 [사용자 지정 DB 클러스터 파라미터 그룹을 생성](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.Aurora.html)하여 논리적 복제를 구성합니다.

   ```
   rds.logical_replication=1
       aurora.enhanced_logical_replication=1
       aurora.logical_replication_backup=0
       aurora.logical_replication_globaldb=0
   ```

1. [Aurora PostgreSQL DB 클러스터를 선택하거나 생성하고](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.Aurora.html) 1단계에서 생성한 파라미터 그룹을 DB 클러스터와 연결합니다.

1. [Aurora 및 AWS Secrets Manager에서 암호 관리를 사용](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html)하여 Amazon Aurora 클러스터에서 사용자 이름과 암호 인증을 설정합니다. [Secrets Manager 보안 암호를 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)하여 사용자 이름/암호 조합을 생성할 수도 있습니다.

1. 전체 초기 스냅샷 기능을 사용하는 경우 Amazon Aurora에서 Amazon S3로 데이터를 내보내기 위한 AWS KMS key 및 IAM 역할을 생성합니다.

   이 IAM 역할에는 다음과 같은 권한 정책도 있어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
           "Version":"2012-10-17",		 	 	 
           "Statement": [
               {
                   "Sid": "ExportPolicy",
                   "Effect": "Allow",
                   "Action": [
                       "s3:PutObject*",
                       "s3:ListBucket",
                       "s3:GetObject*",
                       "s3:DeleteObject*",
                       "s3:GetBucketLocation"
                   ],
                   "Resource": [
                       "arn:aws:s3:::s3-bucket-used-in-pipeline",
                       "arn:aws:s3:::s3-bucket-used-in-pipeline/*"
                   ]
               }
           ]
       }
   ```

------

   이 역할에는 다음과 같은 신뢰 관계도 있어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
           "Version":"2012-10-17",		 	 	 
           "Statement": [
               {
                   "Effect": "Allow",
                   "Principal": {
                       "Service": "export.rds.amazonaws.com"
                   },
                   "Action": "sts:AssumeRole"
               }
           ]
       }
   ```

------

1. OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 선택하거나 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains) 및 [컬렉션 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html#serverless-create)을 참조하세요.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 Amazon Aurora DB 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

## 1단계: 파이프라인 역할 구성
<a name="aurora-mysql-pipeline-role"></a>

Amazon Aurora 파이프라인 사전 조건을 설정한 후 [파이프라인 구성에 사용할 파이프라인 역할을 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-sink)합니다. 또한 Amazon Aurora 소스에 대한 다음 권한을 역할에 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
    "Sid": "allowReadingFromS3Buckets",
    "Effect": "Allow",
    "Action": [
    "s3:GetObject",
    "s3:DeleteObject",
    "s3:GetBucketLocation",
    "s3:ListBucket",
    "s3:PutObject"
    ],
    "Resource": [
    "arn:aws:s3:::s3_bucket",
    "arn:aws:s3:::s3_bucket/*"
    ]
    },
    {
    "Sid": "allowNetworkInterfacesActions",
    "Effect": "Allow",
    "Action": [
    "ec2:AttachNetworkInterface",
    "ec2:CreateNetworkInterface",
    "ec2:CreateNetworkInterfacePermission",
    "ec2:DeleteNetworkInterface",
    "ec2:DeleteNetworkInterfacePermission",
    "ec2:DetachNetworkInterface",
    "ec2:DescribeNetworkInterfaces"
    ],
    "Resource": [
    "arn:aws:ec2:*:111122223333:network-interface/*",
    "arn:aws:ec2:*:111122223333:subnet/*",
    "arn:aws:ec2:*:111122223333:security-group/*"
    ]
    },
    {
    "Sid": "allowDescribeEC2",
    "Effect": "Allow",
    "Action": [
    "ec2:Describe*"
    ],
    "Resource": "*"
    },
    {
    "Sid": "allowTagCreation",
    "Effect": "Allow",
    "Action": [
    "ec2:CreateTags"
    ],
    "Resource": "arn:aws:ec2:*:111122223333:network-interface/*",
    "Condition": {
    "StringEquals": {
    "aws:RequestTag/OSISManaged": "true"
    }
    }
    },
    {
    "Sid": "AllowDescribeInstances",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBInstances"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:db:*"
    ]
    },
    {
    "Sid": "AllowDescribeClusters",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBClusters"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:cluster:DB-id"
    ]
    },
    {
    "Sid": "AllowSnapshots",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBClusterSnapshots",
    "rds:CreateDBClusterSnapshot",
    "rds:AddTagsToResource"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:cluster:DB-id",
    "arn:aws:rds:us-east-2:111122223333:cluster-snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowExport",
    "Effect": "Allow",
    "Action": [
    "rds:StartExportTask"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:cluster:DB-id",
    "arn:aws:rds:us-east-2:111122223333:cluster-snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowDescribeExports",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeExportTasks"
    ],
    "Resource": "*",
    "Condition": {
    "StringEquals": {
    "aws:RequestedRegion": "us-east-2",
    "aws:ResourceAccount": "111122223333"
    }
    }
    },
    {
    "Sid": "AllowAccessToKmsForExport",
    "Effect": "Allow",
    "Action": [
    "kms:Decrypt",
    "kms:Encrypt",
    "kms:DescribeKey",
    "kms:RetireGrant",
    "kms:CreateGrant",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*"
    ],
    "Resource": [
    "arn:aws:kms:us-east-2:111122223333:key/export-key-id"
    ]
    },
    {
    "Sid": "AllowPassingExportRole",
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": [
    "arn:aws:iam::111122223333:role/export-role"
    ]
    },
    {
    "Sid": "SecretsManagerReadAccess",
    "Effect": "Allow",
    "Action": [
    "secretsmanager:GetSecretValue"
    ],
    "Resource": [
    "arn:aws:secretsmanager:*:111122223333:secret:*"
    ]
    }
    ]
    }
```

------

## 2단계: 파이프라인 생성
<a name="aurora-PostgreSQL-pipeline"></a>

Aurora PostgreSQL 클러스터를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

```
version: "2"
aurora-postgres-pipeline:
  source:
    rds:
      db_identifier: "cluster-id"
      engine: aurora-postgresql
      database: "database-name"
      tables:
        include:
          - "schema1.table1"
          - "schema2.table2"
      s3_bucket: "bucket-name"
      s3_region: "bucket-region"
      s3_prefix: "prefix-name"
      export:
        kms_key_id: "kms-key-id"
        iam_role_arn: "export-role-arn"
      stream: true
      aws:
        sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
        region: "us-east-1"
      authentication:
        username: ${{aws_secrets:secret:username}}
        password: ${{aws_secrets:secret:password}}
  sink:
    - opensearch:
        hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
        index: "${getMetadata(\"table_name\")}"
        index_type: custom
        document_id: "${getMetadata(\"primary_key\")}"
        action: "${getMetadata(\"opensearch_action\")}"
        document_version: "${getMetadata(\"document_version\")}"
        document_version_type: "external"
        aws:
          sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
          region: "us-east-1"
extension:
  aws:
    secrets:
      secret:
        secret_id: "rds-secret-id"
        region: "us-east-1"
        sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
        refresh_interval: PT1H
```

**참고**  
사전 구성된 Amazon Aurora 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

Amazon Aurora를 소스로 사용하려면 파이프라인에 대한 VPC 액세스를 구성해야 합니다. 선택한 VPC는 Amazon Aurora 소스에서 사용하는 것과 동일한 VPC여야 합니다. 그런 다음 하나 이상의 서브넷과 하나 이상의 VPC 보안 그룹을 선택합니다. 파이프라인에는 Aurora MySQL 데이터베이스에 대한 네트워크 액세스가 필요하므로 Aurora 클러스터가 파이프라인의 VPC 보안 그룹에서 데이터베이스 포트로의 인바운드 트래픽을 허용하는 VPC 보안 그룹으로 구성되어 있는지도 확인해야 합니다. 자세한 내용은 [보안 그룹을 통한 액세스 제어](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Overview.RDSSecurityGroups.html)를 참조하세요.

를 사용하여 파이프라인 AWS Management Console 을 생성하는 경우 Amazon Aurora를 소스로 사용하려면 VPC에 파이프라인도 연결해야 합니다. 이를 수행하려면 **네트워크 구성** 섹션을 찾아 **VPC에 연결**을 선택하고 제공된 기본 옵션 중 하나에서 CIDR을 선택하거나 자체 CIDR을 선택합니다. [RFC 1918 Best Current Practice](https://datatracker.ietf.org/doc/html/rfc1918)에 정의된 대로 프라이빗 주소 공간에서 모든 CIDR을 사용할 수 있습니다.

사용자 지정 CIDR을 제공하려면 드롭다운 메뉴에서 기타를 선택합니다. OpenSearch Ingestion과 Amazon Aurora 간의 IP 주소 충돌을 방지하려면 Amazon Aurora VPC CIDR이 OpenSearch Ingestion의 CIDR과 달라야 합니다.

자세한 내용은 [파이프라인에 대한 VPC 액세스 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security.html#pipeline-vpc-configure)을 참조하세요.

## 데이터 일관성
<a name="aurora-mysql-pipeline-consistency"></a>

파이프라인은 Amazon Aurora 클러스터의 변경 사항을 지속적으로 폴링하거나 수신하고 OpenSearch 인덱스에서 해당 문서를 업데이트하여 데이터 일관성을 보장합니다.

OpenSearch Ingestion은 데이터 내구성을 보장하는 엔드 투 엔드 승인을 지원합니다. 파이프라인에서는 스냅샷이나 스트림을 읽을 때 병렬 처리를 위해 동적으로 분할을 생성합니다. 파이프라인에서는 OpenSearch 도메인이나 컬렉션에서 모든 레코드를 수집한 후 승인을 받으면 분할을 완료 상태로 표시합니다. OpenSearch Serverless 검색 컬렉션에 수집하려는 경우 파이프라인에서 문서 ID를 생성할 수 있습니다. OpenSearch Serverless 시계열 컬렉션에 수집하려면 파이프라인이 문서 ID를 생성하지 않으므로 파이프라인 싱크 구성`document_id: "${getMetadata(\"primary_key\")}"`에서를 생략해야 합니다.

또한 OpenSearch Ingestion 파이프라인에서는 수신 이벤트 작업을 해당하는 대량 인덱싱 작업에 매핑하여 문서를 쉽게 수집할 수 있게 합니다. 이렇게 하면 데이터 일관성이 유지되므로 Amazon Aurora의 모든 데이터 변경 사항이 OpenSearch에서 해당하는 문서 변경 사항으로 조정됩니다.

## 데이터 형식 매핑
<a name="aurora-PostgreSQL-pipeline-mapping"></a>

OpenSearch Ingestion 파이프라인은 OpenSearch Service 도메인 또는 컬렉션이 사용할 수 있는 표현에 Aurora PostgreSQL 데이터 유형을 매핑합니다. OpenSearch에 매핑 템플릿이 정의되지 않은 경우 OpenSearch는 처음 전송된 문서를 기반으로 [동적 매핑](https://opensearch.org/docs/latest/field-types/#dynamic-mapping)을 사용하여 필드 유형을 자동으로 결정합니다. 매핑 템플릿을 통해 OpenSearch에서 가장 적합한 필드 유형을 명시적으로 정의할 수도 있습니다.

아래 표에는 Aurora PostgreSQL 데이터 유형과 해당 OpenSearch 필드 유형이 나열되어 있습니다. 명시적 매핑이 정의되지 않은 경우 *기본 OpenSearch 필드 유형* 열에 OpenSearch의 해당 필드 유형이 표시됩니다. 이 경우 OpenSearch는 동적 매핑을 사용하여 필드 유형을 자동으로 결정합니다. *권장 OpenSearch 필드 유형* 열은 매핑 템플릿에서 명시적으로 지정하는 해당 권장 필드 유형입니다. 이들 필드 유형은 Aurora PostgreSQL의 데이터 유형과 더 긴밀하게 맞춤화되며 일반적으로 OpenSearch에서 사용할 수 있는 더 나은 검색 기능을 지원할 수 있습니다.


| Aurora PostgreSQL 데이터 유형 | 기본 OpenSearch 필드 유형 | 권장 OpenSearch 필드 유형 | 
| --- | --- | --- | 
| smallint | long | bigint | 
| 정수 | long | 정수 | 
| bigint | long | long | 
| decimal | 텍스트 | double 또는 키워드 | 
| numeric[ (p, s) ] | 텍스트 | double 또는 키워드 | 
| real | 실수 | 실수 | 
| double precision | 실수 | double | 
| smallserial | long | bigint | 
| serial | long | 정수 | 
| bigserial | long | long | 
| money | 객체 | 객체 | 
| character varying(n) | 텍스트 | 텍스트 | 
| varchar(n) | 텍스트 | 텍스트 | 
| character(n) | 텍스트 | 텍스트 | 
| char(n) | 텍스트 | 텍스트 | 
| bpchar(n) | 텍스트 | 텍스트 | 
| bpchar | 텍스트 | 텍스트 | 
| 텍스트 | 텍스트 | 텍스트 | 
| enum | 텍스트 | 텍스트 | 
| bytea | 텍스트 | 이진수 | 
| timestamp [ (p) ](시간대 제외) | long(에포크 밀리초) | 날짜 | 
| timestamp [ (p) ](시간대 포함) | long(에포크 밀리초) | 날짜 | 
| 날짜 | long(에포크 밀리초) | 날짜 | 
| time [ (p) ](시간대 제외) | long(에포크 밀리초) | 날짜 | 
| time [ (p) ](시간대 포함) | long(에포크 밀리초) | 날짜 | 
| interval [ fields ] [ (p) ] | text(ISO8601 형식) | 텍스트 | 
| 부울 | 부울 | 부울 | 
| point | text(WKT 형식) | geo\$1shape | 
| line | text(WKT 형식) | geo\$1shape | 
| lseg | text(WKT 형식) | geo\$1shape | 
| box | text(WKT 형식) | geo\$1shape | 
| 경로 | text(WKT 형식) | geo\$1shape | 
| 다각형 | text(WKT 형식) | geo\$1shape | 
| circle | 객체 | 객체 | 
| cidr | 텍스트 | 텍스트 | 
| inet | 텍스트 | 텍스트 | 
| macaddr | 텍스트 | 텍스트 | 
| macaddr8 | 텍스트 | 텍스트 | 
| bit(n) | long | byte, short, integer 또는 long(비트 수에 따라 다름) | 
| bit varying(n) | long | byte, short, integer 또는 long(비트 수에 따라 다름) | 
| json | 객체 | 객체 | 
| jsonb | 객체 | 객체 | 
| jsonpath | 텍스트 | 텍스트 | 

OpenSearch Ingestion 파이프라인에서 DLQ(Dead Letter Queue)를 구성하는 것이 좋습니다. 이 대기열을 구성하면 OpenSearch Service에서는 동적 매핑 실패로 인해 수집할 수 없는 모든 실패한 문서를 대기열로 전송합니다.

자동 매핑이 실패할 경우 파이프라인 구성에서 `template_type` 및 `template_content`를 사용하여 명시적 매핑 규칙을 정의할 수 있습니다. 또는 파이프라인을 시작하기 전에 검색 도메인이나 컬렉션에서 직접 매핑 템플릿을 생성할 수도 있습니다.

## 제한 사항
<a name="aurora-PostgreSQL-pipeline-limitations"></a>

Aurora PostgreSQL용 OpenSearch Ingestion 파이프라인을 설정하는 경우 다음과 같은 제한 사항을 고려하세요.
+ 이 통합에서는 파이프라인당 하나의 Aurora PostgreSQL 데이터베이스만 지원합니다.
+ 이 통합에서는 현재 교차 리전 데이터 수집을 지원하지 않습니다. Amazon Aurora 클러스터와 OpenSearch 도메인은 동일한 AWS 리전에 있어야 합니다.
+ 이 통합에서는 현재 교차 계정 데이터 수집을 지원하지 않습니다. Amazon Aurora 클러스터와 OpenSearch Ingestion 파이프라인은 동일한 AWS 계정에 있어야 합니다.
+ 지원되는 유일한 인증 메커니즘인 AWS Secrets Manager를 사용한 인증이 Amazon Aurora 클러스터에 활성화되어 있는지 확인합니다.
+ 기존 파이프라인 구성은 다른 데이터베이스 및/또는 다른 테이블에서 데이터를 수집하도록 업데이트할 수 없습니다. 파이프라인의 데이터베이스 및/또는 테이블 이름을 업데이트하려면 파이프라인을 중지하고 업데이트된 구성으로 다시 시작하거나 새 파이프라인을 생성해야 합니다.
+ 데이터 정의 언어(DDL) 문은 일반적으로 지원되지 않습니다. 다음의 경우에는 데이터 일관성이 유지되지 않습니다.
  + 기본 키가 변경될 경우(추가/삭제/이름 변경)
  + 테이블이 삭제되거나 잘린 경우.
  + 열 이름 또는 데이터 형식이 변경된 경우.
+ 동기화할 Aurora PostgreSQL 테이블에 기본 키가 정의되지 않은 경우 데이터 일관성이 보장되지 않습니다. 업데이트/삭제를 OpenSearch에 동기화하려면 OpenSearch 및 싱크 구성에서 사용자 지정 `document_id` 옵션을 올바르게 정의해야 합니다.
+ 지원되는 버전: Aurora PostgreSQL 버전 16.4 이상 

## 권장되는 CloudWatch 경보
<a name="aurora-mysql-pipeline-metrics"></a>

수집 파이프라인의 성능을 모니터링하려면 다음 CloudWatch 지표가 권장됩니다. 이러한 지표는 내보내기에서 처리된 데이터의 양, 스트림에서 처리된 이벤트의 수, 내보내기 및 스트림 이벤트 처리 오류, 대상에 쓴 문서 수를 식별하는 데 도움이 될 수 있습니다. 이러한 지표 중 하나가 지정된 시간 동안 지정된 값을 초과하면 작업을 수행하도록 CloudWatch 경보를 설정할 수 있습니다.


| 지표 | 설명 | 
| --- | --- | 
| pipeline-name.rds.credentialsChanged | 이 지표는 AWS 보안 암호 교체 빈도를 나타냅니다. | 
| pipeline-name.rds.executorRefreshErrors | 이 지표는 AWS 보안 암호 새로 고침 실패를 나타냅니다. | 
| pipeline-name.rds.exportRecordsTotal | 이 지표는 Amazon Aurora에서 내보낸 레코드 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 레코드 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordProcessingErrors | 이 지표는 Amazon Aurora 클러스터에서 데이터를 읽는 동안 OpenSearch Ingestion 파이프라인에서 처리한 오류 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsSuccessTotal | 이 지표는 성공적으로 처리한 내보내기 레코드의 총 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsFailedTotal | 이 지표는 처리하지 못한 내보내기 레코드의 총 수를 나타냅니다. | 
| pipeline-name.rds.bytesReceived | 이 지표는 OpenSearch Ingestion 파이프라인에서 수신한 총 바이트 수를 나타냅니다. | 
| pipeline-name.rds.bytesProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 총 바이트 수를 나타냅니다. | 
| pipeline-name.rds.streamRecordsSuccessTotal | 이 지표는 스트림에서 성공적으로 처리한 레코드 수를 나타냅니다. | 
| pipeline-name.rds.streamRecordsFailedTotal | 이 지표는 스트림에서 처리하지 못한 총 레코드 수를 나타냅니다. | 

# Amazon DynamoDB와 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-ddb"></a>

[DynamoDB](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/dynamo-db/) 플러그인을 사용하여 생성, 업데이트, 삭제 등의 테이블 이벤트를 Amazon OpenSearch Service 도메인 및 Amazon OpenSearch Serverless 컬렉션으로 스트리밍할 수 있습니다. 파이프라인은 변경 데이터 캡처(CDC)를 사용하여 지연 시간이 짧은 대규모 스트리밍을 지원합니다.

전체 초기 스냅샷을 사용하거나 사용하지 않으면서 DynamoDB 데이터를 처리할 수 있습니다.
+ **전체 스냅샷 사용** - DynamoDB가 [시점 복구](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/PointInTimeRecovery.html)(PITR)를 사용하여 백업을 생성하고 Amazon S3에 업로드합니다. 그런 다음 OpenSearch Ingestion이 하나 이상의 OpenSearch 인덱스에서 스냅샷을 인덱싱합니다. 일관성을 유지하기 위해 파이프라인은 모든 DynamoDB 변경 사항을 OpenSearch와 동기화합니다. 이 옵션을 사용하려면 PITR과 [DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.Streams)를 모두 활성화해야 합니다.
+ **스냅샷 사용 안 함** - OpenSearch Ingestion이 새 DynamoDB 이벤트만 스트리밍합니다. 이미 스냅샷이 있거나 기록 데이터 없이 실시간 스트리밍이 필요한 경우 이 옵션을 선택합니다. 이 옵션을 사용하려면 DynamoDB 스트림만 활성화해야 합니다.

자세한 내용은 *Amazon DynamoDB 개발자 가이드*의 [DynamoDB zero-ETL integration with Amazon OpenSearch Service](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/OpenSearchIngestionForDynamoDB.html)를 참조하세요.

**Topics**
+ [사전 조건](#s3-prereqs)
+ [1단계: 파이프라인 역할 구성](#ddb-pipeline-role)
+ [2단계: 파이프라인 생성](#ddb-pipeline)
+ [데이터 일관성](#ddb-pipeline-consistency)
+ [데이터 형식 매핑](#ddb-pipeline-mapping)
+ [제한 사항](#ddb-pipeline-limitations)
+ [DynamoDB에 대해 권장되는 CloudWatch 경보](#ddb-pipeline-metrics)

## 사전 조건
<a name="s3-prereqs"></a>

파이프라인을 설정하려면 DynamoDB 스트림이 활성화된 DynamoDB 테이블이 있어야 합니다. 스트림은 `NEW_IMAGE` 스트림 뷰 유형을 사용해야 합니다. 하지만 `NEW_AND_OLD_IMAGES` 유형이 사용 사례에 맞는 경우 OpenSearch Ingestion 파이프라인에서는 이 스트림 뷰 유형으로도 이벤트를 스트리밍할 수 있습니다.

스냅샷을 사용하는 경우 테이블에서 특정 시점 복구도 활성화해야 합니다. 자세한 내용은 *Amazon DynamoDB 개발자 안내서*의 [테이블 생성](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.Basics.html#WorkingWithTables.Basics.CreateTable), [특정 시점으로 복구 활성화](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/PointInTimeRecovery_Howitworks.html#howitworks_enabling) 및 [스트림 활성화](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html#Streams.Enabling)를 참조하세요.

## 1단계: 파이프라인 역할 구성
<a name="ddb-pipeline-role"></a>

DynamoDB 테이블을 설정한 후 파이프라인 구성에서 사용하려는 [파이프라인 역할을 설정](pipeline-security-overview.md#pipeline-security-sink)하고 다음 DynamoDB 권한을 해당 역할에 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "allowRunExportJob",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:DescribeContinuousBackups",
                "dynamodb:ExportTableToPointInTime"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:111122223333:table/my-table"
            ]
        },
        {
            "Sid": "allowCheckExportjob",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeExport"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:111122223333:table/my-table/export/*"
            ]
        },
        {
            "Sid": "allowReadFromStream",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:111122223333:table/my-table/stream/*"
            ]
        },
        {
            "Sid": "allowReadAndWriteToS3ForExport",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/export-folder/*"
            ]
        }
    ]
}
```

------

 AWS KMS 고객 관리형 키를 사용하여 내보내기 데이터 파일을 암호화할 수도 있습니다. 내보낸 객체를 해독하려면 파이프라인의 내보내기 구성에서 키 ID에 `arn:aws:kms:region:account-id:key/my-key-id` 형식으로 `s3_sse_kms_key_id`를 지정합니다. 다음 정책에는 고객 관리형 키를 사용하는 데 필요한 권한이 포함되어 있습니다.

```
{
    "Sid": "allowUseOfCustomManagedKey",
    "Effect": "Allow",
    "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
    ],
    "Resource": arn:aws:kms:region:account-id:key/my-key-id
}
```

## 2단계: 파이프라인 생성
<a name="ddb-pipeline"></a>

이제 DynamoDB를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다. 이 샘플 파이프라인은 PITR 스냅샷이 있는 `table-a`에서 데이터를 수집한 다음 DynamoDB 스트림에서 이벤트를 수집합니다. `LATEST` 시작 위치는 파이프라인이 DynamoDB 스트림에서 최신 데이터를 읽어야 함을 나타냅니다.

```
version: "2"
cdc-pipeline:
  source:
    dynamodb:
      tables:
      - table_arn: "arn:aws:dynamodb:region:account-id:table/table-a"  
        export:
          s3_bucket: "my-bucket"
          s3_prefix: "export/"
        stream:
          start_position: "LATEST"
      aws:
        region: "us-east-1"
  sink:
  - opensearch:
      hosts: ["https://search-mydomain.region.es.amazonaws.com"]
      index: "${getMetadata(\"table-name\")}"
      index_type: custom
      normalize_index: true
      document_id: "${getMetadata(\"primary_key\")}"
      action: "${getMetadata(\"opensearch_action\")}"
      document_version: "${getMetadata(\"document_version\")}"
      document_version_type: "external"
```

사전 구성된 DynamoDB 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

## 데이터 일관성
<a name="ddb-pipeline-consistency"></a>

OpenSearch Ingestion은 데이터 내구성을 보장하는 엔드 투 엔드 승인을 지원합니다. 파이프라인에서는 스냅샷이나 스트림을 읽을 때 병렬 처리를 위해 동적으로 분할을 생성합니다. 파이프라인에서는 OpenSearch 도메인이나 컬렉션에서 모든 레코드를 수집한 후 승인을 받으면 분할을 완료 상태로 표시합니다.

OpenSearch Serverless *검색* 컬렉션에 수집하려는 경우 파이프라인에서 문서 ID를 생성할 수 있습니다. OpenSearch Serverless *시계열* 컬렉션에 수집하려는 경우에는 파이프라인에서 문서 ID를 생성하지 않습니다.

또한 OpenSearch Ingestion 파이프라인에서는 수신 이벤트 작업을 해당하는 대량 인덱싱 작업에 매핑하여 문서를 쉽게 수집할 수 있게 합니다. 이렇게 하면 데이터 일관성이 유지되므로 DynamoDB의 모든 데이터 변경 사항이 OpenSearch에서 해당하는 문서 변경 사항으로 조정됩니다.

## 데이터 형식 매핑
<a name="ddb-pipeline-mapping"></a>

OpenSearch Service에서는 각 수신 문서의 데이터 형식을 DynamoDB의 해당 데이터 형식에 동적으로 매핑합니다. 다음 표에서는 OpenSearch Service에서 다양한 데이터 형식을 자동으로 매핑하는 방법을 보여줍니다.


| 데이터 유형 | OpenSearch | DynamoDB | 
| --- | --- | --- | 
| 숫자 |  OpenSearch에서는 숫자 데이터를 자동으로 매핑합니다. 숫자가 정수인 경우 OpenSearch에서는 숫자를 긴 정수 값으로 매핑합니다. 숫자가 소수인 경우 OpenSearch에서는 숫자를 부동 소수점 값으로 매핑합니다. OpenSearch에서는 처음 보낸 문서를 기반으로 다양한 속성을 동적으로 매핑합니다. DynamoDB의 동일한 속성에 정수와 분수와 같은 여러 데이터 형식이 혼합되어 있는 경우 매핑이 실패할 수 있습니다. 예를 들어 첫 번째 문서에는 정수인 속성이 있고 이후 문서에는 동일한 속성이 소수로 되어 있는 경우 OpenSearch에서 두 번째 문서를 수집하지 못합니다. 이러한 경우에는 다음과 같은 명시적 매핑 템플릿을 제공해야 합니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "MixedNumberAttribute": {<br />     "type": "float"<br />    }<br />   }<br />  }<br /> }<br />}</pre> 배정밀도가 필요한 경우 문자열 형식의 필드 매핑을 사용합니다. OpenSearch에는 38자리 정밀도를 지원하는 동등한 숫자 형식이 없습니다.  |  DynamoDB는 [숫자](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.Number)를 지원합니다.  | 
| 숫자 집합 | OpenSearch에서는 숫자 집합을 긴 정수 값이나 부동 소수점 값의 배열에 자동으로 매핑합니다. 스칼라 수와 마찬가지로, 매핑은 수집된 첫 번째 숫자가 정수인지 소수인지에 따라 달라집니다. 스칼라 문자열을 매핑하는 것과 같은 방식으로 숫자 집합에 대한 매핑을 제공할 수 있습니다. |  DynamoDB는 [숫자 집합](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.SetTypes)을 나타내는 형식을 지원합니다.  | 
| 문자열 |  OpenSearch에서는 문자열 값을 자동으로 텍스트에 매핑합니다. 열거된 값과 같은 일부 상황에서는 키워드 형식에 매핑할 수 있습니다. 다음 예제에서는 이름이 `PartType`인 DynamoDB 속성을 OpenSearch 키워드에 매핑하는 방법을 보여줍니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "PartType": {<br />     "type": "keyword"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  |  DynamoDB는 [문자열](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.String)을 지원합니다.  | 
| 문자열 집합 |  OpenSearch에서는 문자열 집합을 자동으로 문자열 배열에 매핑합니다. 스칼라 문자열을 매핑하는 것과 같은 방식으로 문자열 집합에 대한 매핑을 제공할 수 있습니다.  | DynamoDB는 [문자열 집합](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.SetTypes)을 나타내는 형식을 지원합니다. | 
| 바이너리 |  OpenSearch에서는 바이너리 데이터를 자동으로 텍스트에 매핑합니다. OpenSearch에서 이러한 데이터를 바이너리 필드로 작성하기 위한 매핑을 제공할 수 있습니다. 다음 예제에서는 이름이 `ImageData`인 DynamoDB 속성을 OpenSearch 바이너리 필드에 매핑하는 방법을 보여줍니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "ImageData": {<br />     "type": "binary"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  | DynamoDB는 [이진수 형식 속성](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.Binary)을 지원합니다. | 
| 이진수 집합 |  OpenSearch에서는 이진수 집합을 텍스트 형식인 이진수 데이터 배열에 자동으로 매핑합니다. 스칼라 이진수를 매핑하는 것과 같은 방식으로 숫자 집합에 대한 매핑을 제공할 수 있습니다.  | DynamoDB에서는 [이진수 값 집합](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.SetTypes)을 나타내는 형식을 지원합니다. | 
| 부울 |  OpenSearch에서는 DynamoDB 부울 형식을 OpenSearch 부울 형식으로 매핑합니다.  |  DynamoDB에서는 [부울 형식 속성](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.Boolean)을 지원합니다.  | 
| Null |  OpenSearch에서는 DynamoDB null 형식의 문서를 수집할 수 있습니다. 값을 문서에 null 값으로 저장합니다. 이 형식에는 매핑이 없으며 이 필드는 인덱싱되거나 검색할 수 없습니다. 한 속성 이름을 null 형식에 사용한 후 나중에 문자열과 같은 다른 형식으로 변경하면 OpenSearch에서 null이 아닌 첫 번째 값에 대해 동적 매핑을 생성합니다. 후속 값은 여전히 DynamoDB null 값일 수 있습니다.  | DynamoDB는 [null 형식 속성](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.Null)을 지원합니다. | 
| 맵 |  OpenSearch에서는 DynamoDB 맵 속성을 중첩 필드에 매핑합니다. 중첩 필드 내에도 동일한 매핑이 적용됩니다. 다음 예제에서는 중첩 필드의 문자열을 OpenSearch의 키워드 형식에 매핑합니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "AdditionalDescriptions": {<br />     "properties": {<br />      "PartType": {<br />       "type": "keyword"<br />      }<br />     }<br />    }<br />   }<br />  }<br /> }<br />}</pre>  | DynamoDB는 [맵 형식 속성](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.Document.Map)을 지원합니다. | 
| List |  OpenSearch에서는 목록의 내용에 따라 DynamoDB 목록에 대해 다른 결과를 제공합니다. 목록에 모두 동일한 유형의 스칼라 형식(예: 모든 문자열 목록)이 포함된 경우 OpenSearch에서는 해당 목록을 해당 형식의 배열로 수집합니다. 이 방식은 문자열, 숫자, 부울 및 null 유형에서 작동합니다. 각 형식에 대한 제한은 해당 형식의 스칼라에 대한 제한과 동일합니다. 맵에 사용하는 것과 동일한 매핑을 사용하여 맵 목록에 대한 매핑을 제공할 수도 있습니다. 혼합 형식 목록은 제공할 수 없습니다.  |  DynamoDB는 [목록 형식 속성](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.Document.List)을 지원합니다.  | 
| Set |  OpenSearch에서는 집합의 내용에 따라 DynamoDB 집합에 대해 다른 결과를 제공합니다. 집합에 모두 동일한 유형의 스칼라 형식(예: 모든 문자열 집합)이 포함된 경우 OpenSearch에서는 해당 집합을 해당 형식의 배열로 수집합니다. 이 방식은 문자열, 숫자, 부울 및 null 유형에서 작동합니다. 각 형식에 대한 제한은 해당 형식의 스칼라에 대한 제한과 동일합니다. 맵에 사용하는 것과 동일한 매핑을 사용하여 맵 집합에 대한 매핑을 제공할 수도 있습니다. 혼합 형식 집합은 제공할 수 없습니다.  | DynamoDB는 [집합](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes.SetTypes)을 나타내는 형식을 지원합니다. | 

OpenSearch Ingestion 파이프라인에서 DLQ(Dead Letter Queue)를 구성하는 것이 좋습니다. 이 대기열을 구성하면 OpenSearch Service에서는 동적 매핑 실패로 인해 수집할 수 없는 모든 실패한 문서를 대기열로 전송합니다.

자동 매핑이 실패할 경우 파이프라인 구성에서 `template_type` 및 `template_content`를 사용하여 명시적 매핑 규칙을 정의할 수 있습니다. 또는 파이프라인을 시작하기 전에 검색 도메인이나 컬렉션에서 직접 매핑 템플릿을 생성할 수도 있습니다.

## 제한 사항
<a name="ddb-pipeline-limitations"></a>

DynamoDB용 OpenSearch Ingestion 파이프라인을 설정하는 경우 다음과 같은 제한 사항을 고려하세요.
+ DynamoDB와의 OpenSearch Ingestion 통합 기능에서는 현재 교차 리전 수집을 지원하지 않습니다. DynamoDB 테이블과 OpenSearch Ingestion 파이프라인은 동일한 AWS 리전에 속해야 합니다.
+ DynamoDB 테이블과 OpenSearch Ingestion 파이프라인은 동일한 AWS 계정에 속해야 합니다.
+ OpenSearch Ingestion 파이프라인은 단일 DynamoDB 테이블만 소스로 지원합니다.
+ DynamoDB 스트림은 최대 24시간 동안만 데이터를 로그에 저장합니다. 대규모 테이블의 초기 스냅샷에서 수집하는 데 24시간 이상 걸리는 경우 일부 초기 데이터 손실이 발생합니다. 이러한 데이터 손실 문제를 완화하려면 테이블 크기를 예측하고 OpenSearch Ingestion 파이프라인의 적절한 컴퓨팅 유닛을 구성하십시오.

## DynamoDB에 대해 권장되는 CloudWatch 경보
<a name="ddb-pipeline-metrics"></a>

수집 파이프라인의 성능을 모니터링하려면 다음 CloudWatch 지표가 권장됩니다. 이러한 지표는 내보내기에서 처리된 데이터의 양, 스트림에서 처리된 이벤트의 양, 내보내기 및 스트림 이벤트 처리 오류, 대상에 쓴 문서 수를 식별하는 데 도움이 될 수 있습니다. 이러한 지표 중 하나가 지정된 시간 동안 지정된 값을 초과하면 작업을 수행하도록 CloudWatch 경보를 설정할 수 있습니다.


| 지표 | 설명 | 
| --- |--- |
| dynamodb-pipeline.BlockingBuffer.bufferUsage.value |  사용 중인 버퍼의 양을 나타냅니다.  | 
|  dynamodb-pipeline.dynamodb.activeExportS3ObjectConsumers.value  |  내보내기를 위해 Amazon S3 객체를 적극적으로 처리하는 총 OCU 수를 표시합니다.  | 
|  dynamodb-pipeline.dynamodb.bytesProcessed.count  |  DynamoDB 소스에서 처리된 바이트 수.  | 
|  dynamodb-pipeline.dynamodb.changeEventsProcessed.count  |  DynamoDB 스트림에서 처리된 변경 이벤트 수.  | 
|  dynamodb-pipeline.dynamodb.changeEventsProcessingErrors.count  |  DynamoDB에서 처리된 변경 이벤트의 오류 수.  | 
|  dynamodb-pipeline.dynamodb.exportJobFailure.count  | Number of export job submission attempts that have failed. | 
|  dynamodb-pipeline.dynamodb.exportJobSuccess.count  | Number of export jobs that have been submitted successfully. | 
|  dynamodb-pipeline.dynamodb.exportRecordsProcessed.count  |  내보내기에서 처리된 총 레코드 수.  | 
|  dynamodb-pipeline.dynamodb.exportRecordsTotal.count  |  데이터 내보내기 볼륨을 추적하는 데 필요한 DynamoDB에서 내보낸 레코드의 총 수.  | 
|  dynamodb-pipeline.dynamodb.exportS3ObjectsProcessed.count  | Total number of export data files that have been processed successfully from Amazon S3. | 
|  dynamodb-pipeline.opensearch.bulkBadRequestErrors.count  | Count of errors during bulk requests due to malformed request. | 
|  dynamodb-pipeline.opensearch.bulkRequestLatency.avg  | Average latency for bulk write requests made to OpenSearch. | 
|  dynamodb-pipeline.opensearch.bulkRequestNotFoundErrors.count  | Number of bulk requests that failed because the target data could not be found. | 
|  dynamodb-pipeline.opensearch.bulkRequestNumberOfRetries.count  | Number of retries by OpenSearch Ingestion pipelines to write OpenSearch cluster. | 
|  dynamodb-pipeline.opensearch.bulkRequestSizeBytes.sum  | Total size in bytes of all bulk requests made to OpenSearch. | 
|  dynamodb-pipeline.opensearch.documentErrors.count  | Number of errors when sending documents to OpenSearch. The documents causing the errors witll be sent to DLQ. | 
|  dynamodb-pipeline.opensearch.documentsSuccess.count  | Number of documents successfully written to an OpenSearch cluster or collection. | 
|  dynamodb-pipeline.opensearch.documentsSuccessFirstAttempt.count  | Number of documents successfully indexed in OpenSearch on the first attempt. | 
|  `dynamodb-pipeline.opensearch.documentsVersionConflictErrors.count`  | Count of errors due to version conflicts in documents during processing. | 
|  `dynamodb-pipeline.opensearch.PipelineLatency.avg`  | Average latency of OpenSearch Ingestion pipeline to process the data by reading from the source to writint to the destination. | 
|  dynamodb-pipeline.opensearch.PipelineLatency.max  | Maximum latency of OpenSearch Ingestion pipeline to process the data by reading from the source to writing the destination. | 
|  dynamodb-pipeline.opensearch.recordsIn.count  | Count of records successfully ingested into OpenSearch. This metric is essential for tracking the volume of data being processed and stored. | 
|  dynamodb-pipeline.opensearch.s3.dlqS3RecordsFailed.count  | Number of records that failed to write to DLQ. | 
|  dynamodb-pipeline.opensearch.s3.dlqS3RecordsSuccess.count  | Number of records that are written to DLQ. | 
|  dynamodb-pipeline.opensearch.s3.dlqS3RequestLatency.count  | Count of latency measurements for requests to the Amazon S3 dead-letter queue. | 
|  dynamodb-pipeline.opensearch.s3.dlqS3RequestLatency.sum  | Total latency for all requests to the Amazon S3 dead-letter queue | 
|  dynamodb-pipeline.opensearch.s3.dlqS3RequestSizeBytes.sum  | Total size in bytes of all requests made to the Amazon S3 dead-letter queue. | 
|  dynamodb-pipeline.recordsProcessed.count  | Total number of records processed in the pipeline, a key metric for overal throughput. | 
|  dynamodb.changeEventsProcessed.count  | No records are being gathered from DynamoDB streams. This could be due to no activitiy on the table, an export being in progress, or an issue accessing the DynamoDB streams. | 
|  `dynamodb.exportJobFailure.count`  | The attempt to trigger an export to S3 failed. | 
|  `dynamodb-pipeline.opensearch.bulkRequestInvalidInputErrors.count`  | Count of bulk request errors in OpenSearch due to invalid input, crucial for monitoring data quality and operational issues. | 
|  opensearch.EndToEndLatency.avg  | The end to end latnecy is higher than desired for reading from DynamoDB streams. This could be due to an underscaled OpenSearch cluster or a maximum pipeline OCU capacity that is too low for the WCU throughput on the DynamoDB table. This end to end latency will be high after an export and should decrease over time as it catches up to the latest DynamoDB streams. | 

# Amazon DocumentDB에서 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-docdb"></a>

[DocumentDB](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/documentdb/) 플러그인을 사용하여 생성, 업데이트, 삭제 등의 문서 변경 사항을 Amazon OpenSearch Service로 스트리밍할 수 있습니다. 이 파이프라인은 가능한 경우 변경 데이터 캡처(CDC) 또는 지연 시간이 짧은 대규모 스트리밍을 위한 API 폴링을 지원합니다.

전체 초기 스냅샷을 사용하거나 사용하지 않으면서 데이터를 처리할 수 있습니다. 전체 스냅샷은 전체 Amazon DocumentDB 컬렉션을 캡처하여 Amazon S3에 업로드합니다. 그러면 이 파이프라인이 데이터를 하나 이상의 OpenSearch 인덱스로 전송합니다. 스냅샷을 수집한 후 이 파이프라인은 지속적인 변경 사항을 동기화하여 일관성을 유지하고 결국 거의 실시간에 가까운 업데이트를 포착합니다.

다른 소스의 전체 스냅샷이 이미 있거나 새 이벤트만 처리해야 하는 경우 스냅샷 없이 스트리밍할 수 있습니다. 이 경우 파이프라인은 초기 대량 로드 없이 Amazon DocumentDB 변경 스트림에서 직접 읽습니다.

스트리밍을 활성화하는 경우 Amazon DocumentDB 컬렉션에 대해 [변경 스트림을 활성화](https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html#change_streams-enabling)해야 합니다. 하지만 전체 로드 또는 내보내기만 수행하는 경우에는 변경 스트림이 필요하지 않습니다.

## 사전 조건
<a name="s3-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. **Amazon DocumentDB 개발자 안내서의 [Create an Amazon DocumentDB cluster](https://docs.aws.amazon.com/documentdb/latest/developerguide/get-started-guide.html#cloud9-cluster)에 나온 단계를 수행하여 데이터 읽기 권한을 가진 Amazon DocumentDB 클러스터를 생성합니다. CDC 인프라를 사용하는 경우 변경 스트림을 게시하도록 Amazon DocumentDB 클러스터를 구성합니다.

1. Amazon DocumentDB 클러스터에서 TLS를 활성화합니다.

1. OpenSearch Ingestion에서 사용할 프라이빗 주소 공간의 VPC CIDR을 설정합니다.

1. 를 사용하여 Amazon DocumentDB 클러스터에 대한 인증을 설정합니다 AWS Secrets Manager. [Automatically Rotating Passwords for Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.managing-users.html#security.managing-users-rotating-passwords)에 나온 단계를 수행하여 스크릿 교체를 활성화합니다. 자세한 내용은 [Database Access Using Role-Based Access Control](https://docs.aws.amazon.com/documentdb/latest/developerguide/role_based_access_control.html) 및 [Security in Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/security.html)를 참조하세요.

1. 변경 스트림을 사용하여 Amazon DocumentDB 컬렉션의 데이터 변경 사항을 구독하는 경우 `change_stream_log_retention_duration` 파라미터를 사용하여 보존 기간을 최대 7일로 연장해 데이터 손실을 방지합니다. 변경 스트림 이벤트는 이벤트가 기록된 후 기본적으로 3시간 동안 저장됩니다.단, 대규모 수집에 충분한 시간이 아닙니다. 변경 스트림 보존 기간을 수정하려면 [Modifying the Change Stream Log Retention Duration](https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html#change_streams-modifying_log_retention)을 참조하세요.

1. OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](createupdatedomains.md#createdomains) 및 [컬렉션 생성](serverless-create.md) 섹션을 참조하세요.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 Amazon DocumentDB 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

   다음 샘플 도메인 액세스 정책은 다음 단계에서 생성하는 파이프라인 역할을 사용하여 도메인에 데이터를 쓰도록 허용합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::444455556666:role/pipeline-role"
         },
         "Action": [
           "es:DescribeDomain",
           "es:ESHttp*"
         ],
         "Resource": [
           "arn:aws:es:us-east-1:111122223333:domain/domain-name"
         ]
       }
     ]
   }
   ```

------

   컬렉션 또는 도메인에 쓰기 데이터에 액세스할 수 있는 올바른 권한이 있는 IAM 역할을 생성하려면 [Amazon OpenSearch Ingestion 내 역할 및 사용자 설정](pipeline-security-overview.md)을 참조하세요.

## 1단계: 파이프라인 역할 구성
<a name="docdb-pipeline-role"></a>

Amazon DocumentDB 파이프라인 사전 조건을 설정한 후 파이프라인 구성에서 사용하려는 [파이프라인 역할을 구성](pipeline-security-overview.md#pipeline-security-sink)하고 역할에서 다음 Amazon DocumentDB 권한을 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "allowS3ListObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::s3-bucket"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": "s3-prefix/*"
                }
            }
        },
        {
            "Sid": "allowReadAndWriteToS3ForExportStream",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::s3-bucket/s3-prefix/*"
            ]
        },
        {
            "Sid": "SecretsManagerReadAccess",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1:111122223333:secret:secret-name"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AttachNetworkInterface",
                "ec2:CreateNetworkInterface",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:DeleteNetworkInterface",
                "ec2:DeleteNetworkInterfacePermission",
                "ec2:DetachNetworkInterface",
                "ec2:DescribeNetworkInterfaces"
            ],
            "Resource": [
                "arn:aws:ec2:*:111122223333:network-interface/*",
                "arn:aws:ec2:*:111122223333:subnet/*",
                "arn:aws:ec2:*:111122223333:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeDhcpOptions",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:*:*:network-interface/*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/OSISManaged": "true"
                }
            }
        }
    ]
}
```

------

파이프라인은 이러한 권한을 사용하여 VPC에서 네트워크 인터페이스를 생성하고 삭제하므로 OpenSearch Ingestion 파이프라인을 생성하는 데 사용하는 IAM 역할에서 위의 Amazon EC2 권한을 제공해야 합니다. 파이프라인은 오직 이 네트워크 인터페이스를 통해 Amazon DocumentDB 클러스터에 액세스할 수 있습니다.

## 2단계: 파이프라인 생성
<a name="docdb-pipeline"></a>

이제 Amazon DocumentDB를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다. 인덱스 이름을 채우기 위해 `getMetadata` 함수는 `documentdb_collection`을 메타데이터 키로 사용합니다. `getMetadata` 메서드 없이 다른 인덱스 이름을 사용하려면 `index: "my_index_name"` 구성을 사용할 수 있습니다.

```
version: "2"
documentdb-pipeline:
  source:
    documentdb:
      acknowledgments: true
      host: "https://docdb-cluster-id.us-east-1.docdb.amazonaws.com"
      port: 27017
      authentication:
        username: ${aws_secrets:secret:username}
        password: ${aws_secrets:secret:password}
      aws:
      s3_bucket: "bucket-name"
      s3_region: "bucket-region" 
      s3_prefix: "path" #optional path for storing the temporary data
      collections:
        - collection: "dbname.collection"
          export: true
          stream: true
  sink:
  - opensearch:
      hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
      index: "${getMetadata(\"documentdb_collection\")}"
      index_type: custom
      document_id: "${getMetadata(\"primary_key\")}"
      action: "${getMetadata(\"opensearch_action\")}"
      document_version: "${getMetadata(\"document_version\")}"
      document_version_type: "external"
extension:
  aws:
    secrets:
      secret:
        secret_id: "my-docdb-secret"
        region: "us-east-1"
        refresh_interval: PT1H
```

사전 구성된 Amazon DocumentDB 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

를 사용하여 파이프라인 AWS Management Console 을 생성하는 경우 Amazon DocumentDB를 소스로 사용하려면 VPC에 파이프라인도 연결해야 합니다. 이를 수행하려면 **소스 네트워크 옵션** 섹션을 찾아 **VPC에 연결** 확인란을 선택하고 제공된 기본 옵션 중 하나에서 CIDR을 선택합니다. [RFC 1918 Best Current Practice](https://datatracker.ietf.org/doc/html/rfc1918)에 정의된 대로 프라이빗 주소 공간에서 모든 CIDR을 사용할 수 있습니다.

사용자 지정 CIDR을 제공하려면 드롭다운 메뉴에서 **기타**를 선택합니다. OpenSearch Ingestion과 자Amazon DocumentDB 간의 IP 주소 충돌을 방지하려면 Amazon DocumentDB VPC CIDR이 OpenSearch Ingestion의 CIDR과 달라야 합니다.

자세한 내용은 [파이프라인에 대한 VPC 액세스 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security.html#pipeline-vpc-configure)을 참조하세요.

## 데이터 일관성
<a name="docdb-pipeline-consistency"></a>

파이프라인은 Amazon DocumentDB 클러스터의 변경 사항을 지속적으로 폴링하거나 수신하고 OpenSearch 인덱스에서 해당 문서를 업데이트하여 데이터 일관성을 보장합니다.

OpenSearch Ingestion은 데이터 내구성을 보장하는 엔드 투 엔드 승인을 지원합니다. 파이프라인에서는 스냅샷이나 스트림을 읽을 때 병렬 처리를 위해 동적으로 분할을 생성합니다. 파이프라인에서는 OpenSearch 도메인이나 컬렉션에서 모든 레코드를 수집한 후 승인을 받으면 분할을 완료 상태로 표시합니다.

OpenSearch Serverless *검색* 컬렉션에 수집하려는 경우 파이프라인에서 문서 ID를 생성할 수 있습니다. OpenSearch Serverless *시계열* 컬렉션으로 수집하려는 경우에는 파이프라인에서 문서 ID를 생성하지 않습니다. 따라서 파이프라인 싱크 구성에서 `document_id: "${getMetadata(\"primary_key\")}"`를 생략해야 합니다.

또한 OpenSearch Ingestion 파이프라인에서는 수신 이벤트 작업을 해당하는 대량 인덱싱 작업에 매핑하여 문서를 쉽게 수집할 수 있게 합니다. 이렇게 하면 데이터 일관성이 유지되므로 Amazon DocumentDB의 모든 데이터 변경 사항이 OpenSearch에서 해당하는 문서 변경 사항으로 조정됩니다.

## 데이터 형식 매핑
<a name="docdb-pipeline-mapping"></a>

OpenSearch Service에서는 각 수신 문서의 데이터 형식을 Amazon DocumentDB의 해당 데이터 형식에 동적으로 매핑합니다. 다음 표에서는 OpenSearch Service에서 다양한 데이터 형식을 자동으로 매핑하는 방법을 보여줍니다.


| 데이터 유형 | OpenSearch | Amazon DocumentDB | 
| --- | --- | --- | 
| Integer |  OpenSearch는 Amazon DocumentDB 정수 값을 OpenSearch 정수에 자동으로 매핑합니다. OpenSearch에서는 처음 보낸 문서를 기반으로 필드를 동적으로 매핑합니다. Amazon DocumentDB에서 동일한 속성에 대해 데이터 유형을 혼합한 경우 자동 매핑이 실패할 수 있습니다. 예를 들어 첫 번째 문서에는 long인 속성이 있고 이후 문서에는 동일한 속성이 정수인 경우 OpenSearch는 두 번째 문서를 수집하지 못합니다. 이러한 경우에는 다음과 같이 보다 유연한 숫자 유형을 선택하는 명시적 매핑 템플릿을 제공해야 합니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "MixedNumberField": {<br />     "type": "float"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  |  Amazon DocumentDB는 [정수](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다.  | 
| Long |  OpenSearch는 Amazon DocumentDB long 값을 OpenSearch long에 자동으로 매핑합니다. OpenSearch에서는 처음 보낸 문서를 기반으로 필드를 동적으로 매핑합니다. Amazon DocumentDB에서 동일한 속성에 대해 데이터 유형을 혼합한 경우 자동 매핑이 실패할 수 있습니다. 예를 들어 첫 번째 문서에는 long인 속성이 있고 이후 문서에는 동일한 속성이 정수인 경우 OpenSearch는 두 번째 문서를 수집하지 못합니다. 이러한 경우에는 다음과 같이 보다 유연한 숫자 유형을 선택하는 명시적 매핑 템플릿을 제공해야 합니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "MixedNumberField": {<br />     "type": "float"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  |  Amazon DocumentDB는 [longs](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다.  | 
| 문자열 |  OpenSearch에서는 문자열 값을 자동으로 텍스트에 매핑합니다. 열거된 값과 같은 일부 상황에서는 키워드 형식에 매핑할 수 있습니다. 다음 예제에서는 이름이 `PartType`인 Amazon DocumentDB 속성을 OpenSearch 키워드에 매핑하는 방법을 보여줍니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "PartType": {<br />     "type": "keyword"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  |  Amazon DocumentDB는 [문자열](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)을 지원합니다.  | 
| 배정밀도 실수 |  OpenSearch는 Amazon DocumentDB double 값을 OpenSearch double 값에 자동으로 매핑합니다. OpenSearch에서는 처음 보낸 문서를 기반으로 필드를 동적으로 매핑합니다. Amazon DocumentDB에서 동일한 속성에 대해 데이터 유형을 혼합한 경우 자동 매핑이 실패할 수 있습니다. 예를 들어 첫 번째 문서에는 long인 속성이 있고 이후 문서에는 동일한 속성이 정수인 경우 OpenSearch는 두 번째 문서를 수집하지 못합니다. 이러한 경우에는 다음과 같이 보다 유연한 숫자 유형을 선택하는 명시적 매핑 템플릿을 제공해야 합니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "MixedNumberField": {<br />     "type": "float"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  | Amazon DocumentDB는 [doubles](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| Date |  기본적으로 날짜는 OpenSearch의 정수에 매핑됩니다. 사용자 지정 매핑 템플릿을 정의하여 날짜를 OpenSearch 날짜에 매핑할 수 있습니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "myDateField": {<br />     "type": "date",<br />     "format": "epoch_second"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  | Amazon DocumentDB는 [날짜](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| 타임스탬프 |  기본적으로 타임스탬프는 OpenSearch의 정수에 매핑됩니다. 사용자 지정 매핑 템플릿을 정의하여 날짜를 OpenSearch 날짜에 매핑할 수 있습니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "myTimestampField": {<br />     "type": "date",<br />     "format": "epoch_second"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  | Amazon DocumentDB는 [타임스탬프](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| 부울 |  OpenSearch에서는 Amazon DocumentDB 부울 유형을 OpenSearch 부울 유형에 매핑합니다.  |  Amazon DocumentDB는 [부울 유형 속성](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)을 지원합니다.  | 
| 10진수 |  OpenSearch는 Amazon DocumentDB 맵 속성을 중첩 필드에 매핑합니다. 중첩 필드 내에도 동일한 매핑이 적용됩니다. 다음 예제에서는 중첩 필드의 문자열을 OpenSearch의 키워드 형식에 매핑합니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "myDecimalField": {<br />     "type": "double"<br />    }<br />   }<br />  }<br /> }<br />}</pre> 이 사용자 지정 매핑을 사용하면 double 수준의 정밀도로 필드를 쿼리하고 집계할 수 있습니다. 원래 값은 OpenSearch 문서의 `_source` 속성에서 전체 정밀도를 유지합니다. 이 매핑이 없으면 OpenSearch는 기본적으로 텍스트를 사용합니다.  | Amazon DocumentDB는 [소수](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| 정규식 | 정규식 유형은 중첩 필드를 생성합니다. 여기에는 <myFieldName>.pattern 및 <myFieldName>.options가 포함됩니다. |  Amazon DocumentDB는 [정규식](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)을 지원합니다.  | 
| 이진 데이터 |  OpenSearch는 Amazon DocumentDB 바이너리 데이터를 OpenSearch 텍스트에 자동으로 매핑합니다. OpenSearch에서 이러한 데이터를 바이너리 필드로 작성하기 위한 매핑을 제공할 수 있습니다. 다음 예제에서는 이름이 `imageData`인 Amazon DocumentDB 필드를 OpenSearch 바이너리 필드에 매핑하는 방법을 보여줍니다. <pre>{<br /> "template": {<br />  "mappings": {<br />   "properties": {<br />    "imageData": {<br />     "type": "binary"<br />    }<br />   }<br />  }<br /> }<br />}</pre>  | Amazon DocumentDB는 [바이너리 데이터 필드](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| ObjectId | objectId 유형의 필드는 OpenSearch 텍스트 필드에 매핑됩니다. 값은 objectId의 문자열 표현입니다. | Amazon DocumentDB는 [objectIds](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| Null |  OpenSearch는 Amazon DocumentDB null 유형의 문서를 수집할 수 있습니다. 값을 문서에 null 값으로 저장합니다. 이 형식에는 매핑이 없으며 이 필드는 인덱싱되거나 검색할 수 없습니다. 한 속성 이름을 null 형식에 사용한 후 나중에 문자열과 같은 다른 형식으로 변경하면 OpenSearch에서 null이 아닌 첫 번째 값에 대해 동적 매핑을 생성합니다. 후속 값은 여전히 Amazon DocumentDB null 값일 수 있습니다.  | Amazon DocumentDB는 [null 유형 필드](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| 정의되지 않음 |  OpenSearch는 Amazon DocumentDB 정의되지 않은 유형의 문서를 수집할 수 있습니다. 값을 문서에 null 값으로 저장합니다. 이 형식에는 매핑이 없으며 이 필드는 인덱싱되거나 검색할 수 없습니다. 정의되지 않은 유형에 동일한 필드 이름을 사용한 후 문자열과 같이 다른 유형으로 변경하면 OpenSearch에서 정의되지 않은 값이 아닌 첫 번째 값에 대해 동적 매핑을 생성합니다. 후속 값은 여전히 Amazon DocumentDB 정의되지 않은 값일 수 있습니다.  | Amazon DocumentDB는 [정의되지 않은 유형 필드](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| MinKey |  OpenSearch는 Amazon DocumentDB minKey 유형의 문서를 수집할 수 있습니다. 값을 문서에 null 값으로 저장합니다. 이 형식에는 매핑이 없으며 이 필드는 인덱싱되거나 검색할 수 없습니다. minKey 유형에 동일한 필드 이름을 사용한 후 문자열과 같이 다른 유형으로 변경하면 OpenSearch에서 minKey가 아닌 첫 번째 값에 대해 동적 매핑을 생성합니다. 후속 값은 여전히 Amazon DocumentDB minKey 값일 수 있습니다.  | Amazon DocumentDB는 [minKey 유형 필드](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 
| MaxKey |  OpenSearch는 Amazon DocumentDB maxKey 유형의 문서를 수집할 수 있습니다. 값을 문서에 null 값으로 저장합니다. 이 형식에는 매핑이 없으며 이 필드는 인덱싱되거나 검색할 수 없습니다. maxKey 유형에 동일한 필드 이름을 사용한 후 문자열과 같이 다른 유형으로 변경하면 OpenSearch에서 maxKey가 아닌 첫 번째 값에 대해 동적 매핑을 생성합니다. 후속 값은 여전히 Amazon DocumentDB maxKey 값일 수 있습니다.  | Amazon DocumentDB는 [maxKey 유형 필드](https://docs.aws.amazon.com/documentdb/latest/developerguide/mongo-apis.html#mongo-apis-data-types)를 지원합니다. | 

OpenSearch Ingestion 파이프라인에서 DLQ(Dead Letter Queue)를 구성하는 것이 좋습니다. 이 대기열을 구성하면 OpenSearch Service에서는 동적 매핑 실패로 인해 수집할 수 없는 모든 실패한 문서를 대기열로 전송합니다.

자동 매핑이 실패할 경우 파이프라인 구성에서 `template_type` 및 `template_content`를 사용하여 명시적 매핑 규칙을 정의할 수 있습니다. 또는 파이프라인을 시작하기 전에 검색 도메인이나 컬렉션에서 직접 매핑 템플릿을 생성할 수도 있습니다.

## 제한 사항
<a name="docdb-pipeline-limitations"></a>

Amazon DocumentDB용 OpenSearch Ingestion 파이프라인을 설정하는 경우 다음과 같은 제한 사항을 고려합니다.
+ Amazon DocumentDB와의 OpenSearch Ingestion 통합 기능에서는 현재 교차 리전 수집을 지원하지 않습니다. Amazon DocumentDB 클러스터와 OpenSearch Ingestion 파이프라인은 동일한 AWS 리전에 있어야 합니다.
+ Amazon DocumentDB와의 OpenSearch Ingestion 통합 기능에서는 현재 교차 계정 수집을 지원하지 않습니다. Amazon DocumentDB 클러스터와 OpenSearch Ingestion 파이프라인은 동일한 AWS 계정에 있어야 합니다.
+ OpenSearch Ingestion 파이프라인은 단일 Amazon DocumentDB 테이블만 소스로 지원합니다.
+ Amazon DocumentDB와의 OpenSearch Ingestion 통합은 특별히 Amazon DocumentDB 인스턴스 기반 클러스터를 지원합니다. Amazon DocumentDB 탄력적 클러스터는 지원하지 않습니다.
+ OpenSearch Ingestion 통합은 Amazon DocumentDB 클러스터의 인증 메커니즘 AWS Secrets Manager 으로 만 지원합니다.
+ 다른 데이터베이스 또는 컬렉션에서 데이터를 수집하도록 기존 파이프라인 구성을 업데이트할 수 없습니다. 대신 새 파이프라인을 생성해야 합니다.

## 권장되는 CloudWatch 경보
<a name="cloudwatch-metrics-docdb"></a>

최상의 성능을 위해 다음 Amazon DocumentDB 클러스터에 소스로 액세스하도록 OpenSearch Ingestion 파이프라인을 생성할 때 다음 CloudWatch 경보를 사용하는 것이 좋습니다.


| CloudWatch 경보 | 설명 | 
| --- | --- | 
| <pipeline-name>.doucmentdb.credentialsChanged | 이 지표는 AWS 보안 암호 교체 빈도를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.executorRefreshErrors | 이 지표는 AWS 시크릿의 새로 고침 실패를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.exportRecordsTotal |  이 지표는 Amazon DocumentDB에서 내보낸 레코드 수를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.exportRecordsProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 레코드 수를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.exportRecordProcessingErrors |  이 지표는 Amazon DocumentDB 클러스터에서 데이터를 읽는 동안 OpenSearch Ingestion 파이프라인에서 처리한 오류 수를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.exportRecordsSuccessTotal |  이 지표는 성공적으로 처리한 내보내기 레코드의 총 수를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.exportRecordsFailedTotal |  이 지표는 처리하지 못한 내보내기 레코드의 총 수를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.bytesReceived |  이 지표는 OpenSearch Ingestion 파이프라인에서 수신한 총 바이트 수를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.bytesProcessed |  이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 총 바이트 수를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.exportPartitionQueryTotal |  이 지표는 내보내기 파티션 합계를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.streamRecordsSuccessTotal |  이 지표는 스트림에서 성공적으로 처리한 레코드 수를 나타냅니다.  | 
| <pipeline-name>.doucmentdb.streamRecordsFailedTotal |  이 지표는 스트림에서 처리하지 못한 총 레코드 수를 나타냅니다.  | 

# Confluent Cloud Kafka에서 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-confluent-kafka"></a>

OpenSearch Ingestion 파이프라인을 사용하여 Confluent Cloud Kafka 클러스터에서 Amazon OpenSearch Service 도메인 및 OpenSearch Serverless 컬렉션으로 데이터를 스트리밍할 수 있습니다. OpenSearch Ingestion은 Confluent Cloud Kafka 클러스터에서 OpenSearch Service 또는 OpenSearch Serverless가 관리하는 도메인 또는 컬렉션으로 데이터를 스트리밍하기 위한 퍼블릭 및 프라이빗 네트워크 구성을 모두 지원합니다.

## Confluent Cloud 퍼블릭 Kafka 클러스터에 대한 연결
<a name="confluent-cloud-kafka-public"></a>

OpenSearch Ingestion 파이프라인을 사용하여 퍼블릭 구성을 통해 자체 관리형 Confluent Cloud Kafka 클러스터에서 데이터를 마이그레이션할 수 있습니다. 즉, 도메인 DNS 이름을 공개적으로 확인할 수 있습니다. 이렇게 하려면 Confluent Cloud 퍼블릭 Kafka 클러스터를 소스로, OpenSearch Service 또는 OpenSearch Serverless를 대상으로 하는 OpenSearch Ingestion 파이프라인을 설정합니다. 이렇게 하면 자체 관리형 소스 클러스터에서 AWS관리형 대상 도메인 또는 컬렉션으로 스트리밍 데이터가 처리됩니다.

### 사전 조건
<a name="confluent-cloud-kafka-public-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. 소스 역할을 하는 Confluent Cloud Kafka 클러스터를 생성합니다. 클러스터에는 OpenSearch Service로 수집할 데이터가 포함되어 있어야 합니다.

1. 데이터를 마이그레이션할 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](createupdatedomains.md#createdomains) 및 [컬렉션 생성](serverless-create.md) 섹션을 참조하세요.

1.  AWS Secrets Manager를 사용하여 Confluent Cloud Kafka 클러스터에서 인증을 설정합니다. [AWS Secrets Manager 시크릿 교체](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)의 단계를 수행하여 시크릿 교체를 활성화합니다.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 자체 관리형 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

   다음 샘플 도메인 액세스 정책은 다음 단계에서 생성하는 파이프라인 역할을 사용하여 도메인에 데이터를 쓰도록 허용합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::444455556666:role/pipeline-role"
         },
         "Action": [
           "es:DescribeDomain",
           "es:ESHttp*"
         ],
         "Resource": [
           "arn:aws:es:us-east-1:111122223333:domain/domain-name"
         ]
       }
     ]
   }
   ```

------

   컬렉션 또는 도메인에 쓰기 데이터에 액세스할 수 있는 올바른 권한이 있는 IAM 역할을 생성하려면 [Amazon OpenSearch Ingestion 내 역할 및 사용자 설정](pipeline-security-overview.md)을 참조하세요.

### 1단계: 파이프라인 역할 구성
<a name="confluent-cloud-kafka-public-pipeline-role"></a>

Confluent Cloud Kafka 클러스터 파이프라인 사전 조건을 설정한 후 파이프라인 구성에 사용할 [파이프라인 역할을 구성](pipeline-security-overview.md#pipeline-security-sink)하고 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션에 쓸 수 있는 권한과 Secrets Manager에서 시크릿을 읽을 수 있는 권한을 추가합니다.

네트워크 인터페이스를 관리하려면 다음 권한이 필요합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AttachNetworkInterface",
                "ec2:CreateNetworkInterface",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:DeleteNetworkInterface",
                "ec2:DeleteNetworkInterfacePermission",
                "ec2:DetachNetworkInterface",
                "ec2:DescribeNetworkInterfaces"
            ],
            "Resource": [
                "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
                "arn:aws:ec2:us-east-1:111122223333:subnet/*",
                "arn:aws:ec2:us-east-1:111122223333:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeDhcpOptions",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:Describe*"
            ],
            "Resource": "arn:aws:ec2:us-east-1:111122223333:subnet/*"
        },
        { 
            "Effect": "Allow",
            "Action": [ "ec2:CreateTags" ],
            "Resource": "arn:aws:ec2:us-east-1:111122223333:network-interface/*",
            "Condition": { 
               "StringEquals": { "aws:RequestTag/OSISManaged": "true" } 
            } 
        }
    ]
}
```

------

다음은 AWS Secrets Manager 서비스에서 보안 암호를 읽는 데 필요한 권한입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SecretsManagerReadAccess",
            "Effect": "Allow",
            "Action": ["secretsmanager:GetSecretValue"],
            "Resource": ["arn:aws:secretsmanager:us-east-1:111122223333:secret:,secret-name"]
        }
    ]
}
```

------

Amazon OpenSearch Service 도메인에 쓰려면 다음 권한이 필요합니다.

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:role/pipeline-role"
      },
      "Action": ["es:DescribeDomain", "es:ESHttp*"],
      "Resource": "arn:aws:es:region:account-id:domain/domain-name/*"
    }
  ]
}
```

### 2단계: 파이프라인 생성
<a name="confluent-cloud-kafka-public-pipeline"></a>

이제 Confluent Cloud Kafka를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

여러 OpenSearch Service 도메인을 데이터의 대상으로 지정할 수 있습니다. 이 기능을 사용하여 조건부로 라우팅하거나 수신 데이터를 여러 OpenSearch Service 도메인으로 복제할 수 있습니다.

소스 Confluent Kafka의 데이터를 OpenSearch Serverless VPC 컬렉션으로 마이그레이션할 수도 있습니다. 파이프라인 구성 내에서 네트워크 액세스 정책을 제공해야 합니다. Confluent 스키마 레지스트리를 사용하여 Confluent 스키마를 정의할 수 있습니다.

```
version: "2"
kafka-pipeline:
  source:
    kafka:
      encryption:
        type: "ssl"
      topics:
        - name: "topic-name"
          group_id: "group-id"
      bootstrap_servers:
        - "bootstrap-server.us-east-1.aws.private.confluent.cloud:9092"
      authentication:
        sasl:
          plain:
            username: ${aws_secrets:confluent-kafka-secret:username}
            password: ${aws_secrets:confluent-kafka-secret:password}
      schema:
        type: confluent
        registry_url: https://my-registry.us-east-1.aws.confluent.cloud
        api_key: "${{aws_secrets:schema-secret:schema_registry_api_key}}"
        api_secret: "${{aws_secrets:schema-secret:schema_registry_api_secret}}"
        basic_auth_credentials_source: "USER_INFO"
  sink:
  - opensearch:
      hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
      aws:
          region: "us-east-1"
  aws:
    secrets:
      confluent-kafka-secret:
        secret_id: "my-kafka-secret"
        region: "us-east-1"
      schema-secret:
        secret_id: "my-self-managed-kafka-schema"
        region: "us-east-1"
```

사전 구성된 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

### VPC에서 Confluent Cloud Kafka 클러스터에 대한 연결
<a name="confluent-cloud-kafka-private"></a>

OpenSearch Ingestion 파이프라인을 사용하여 VPC에서 실행되는 Confluent Cloud Kafka 클러스터에서 데이터를 마이그레이션할 수도 있습니다. 이렇게 하려면 Confluent Cloud Kafka 클러스터를 소스로, OpenSearch Service 또는 OpenSearch Serverless를 대상으로 하는 OpenSearch Ingestion 파이프라인을 설정합니다. 이렇게 하면 Confluent Cloud Kafka 소스 클러스터에서 AWS관리형 대상 도메인 또는 컬렉션으로 스트리밍 데이터를 처리합니다.

 OpenSearch Ingestion은 Confluent에서 지원되는 모든 네트워크 모드에서 구성된 Confluent Cloud Kafka 클러스터를 지원합니다. OpenSearch Ingestion에서 다음 네트워크 구성 모드가 소스로 지원됩니다.
+ AWS VPC 피어링
+  AWS PrivateLink 전용 클러스터용
+  AWS PrivateLink 엔터프라이즈 클러스터용
+ AWS Transit Gateway

#### 사전 조건
<a name="confluent-cloud-kafka-private-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. OpenSearch Service로 수집하려는 데이터가 포함된 VPC 네트워크 구성을 사용하여 Confluent Cloud Kafka 클러스터를 생성합니다.

1. 데이터를 마이그레이션할 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](createupdatedomains.md#createdomains) 및 [컬렉션 생성](serverless-create.md) 섹션을 참조하세요.

1.  AWS Secrets Manager를 사용하여 Confluent Cloud Kafka 클러스터에서 인증을 설정합니다. [AWS Secrets Manager 시크릿 교체](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)의 단계를 수행하여 시크릿 교체를 활성화합니다.

1. Confluent Cloud Kafka 클러스터에 대한 액세스 권한이 있는 VPC의 ID를 획득합니다. OpenSearch Ingestion에서 사용할 VPC CIDR을 선택합니다.
**참고**  
를 사용하여 파이프라인 AWS Management Console 을 생성하는 경우 Confluent Cloud Kafka 클러스터를 사용하려면 OpenSearch Ingestion 파이프라인도 VPC에 연결해야 합니다. 이를 수행하려면 **네트워크 구성** 섹션을 찾아 **VPC에 연결** 확인란을 선택하고 제공된 기본 옵션 중 하나에서 CIDR을 선택하거나 직접 선택합니다. [RFC 1918 Best Current Practice](https://datatracker.ietf.org/doc/html/rfc1918)에 정의된 대로 프라이빗 주소 공간에서 모든 CIDR을 사용할 수 있습니다.  
사용자 지정 CIDR을 제공하려면 드롭다운 메뉴에서 **기타**를 선택합니다. OpenSearch Ingestion과 자체 관리형 OpenSearch 간의 IP 주소 충돌을 방지하려면 자체 관리형 OpenSearch VPC CIDR이 OpenSearch Ingestion의 CIDR과 달라야 합니다.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 자체 관리형 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.
**참고**  
 AWS PrivateLink 를 사용하여 Confluent Cloud Kafka를 연결하는 경우 [VPC DHCP 옵션](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)을 구성해야 합니다. *DNS 호스트 이름*과 *DNS 확인*이 활성화되어 있어야 합니다.  
특히 다음 옵션 세트 값을 사용합니다.  
**엔터프라이즈 클러스터:**  

   ```
   domain-name: aws.private.confluent.cloud
   domain-name-servers: AmazonProvidedDNS
   ```
**전용 클러스터:**  

   ```
   domain-name: aws.confluent.cloud
   domain-name-servers: AmazonProvidedDNS
   ```
이렇게 변경하면 Confluent PrivateLink 엔드포인트의 DNS 확인이 VPC 내에서 올바르게 작동합니다.

   다음 샘플 도메인 액세스 정책은 다음 단계에서 생성하는 파이프라인 역할을 사용하여 도메인에 데이터를 쓰도록 허용합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::444455556666:role/pipeline-role"
         },
         "Action": [
           "es:DescribeDomain",
           "es:ESHttp*"
         ],
         "Resource": [
           "arn:aws:es:us-east-1:111122223333:domain/domain-name"
         ]
       }
     ]
   }
   ```

------

   컬렉션 또는 도메인에 쓰기 데이터에 액세스할 수 있는 올바른 권한이 있는 IAM 역할을 생성하려면 [Amazon OpenSearch Ingestion 내 역할 및 사용자 설정](pipeline-security-overview.md)을 참조하세요.

#### 1단계: 파이프라인 역할 구성
<a name="confluent-cloud-kafka-private-pipeline-role"></a>

파이프라인 사전 조건을 설정한 후 파이프라인 구성에서 사용하려는 [파이프라인 역할을 구성](pipeline-security-overview.md#pipeline-security-sink)하고 역할에서 다음 권한을 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SecretsManagerReadAccess",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": ["arn:aws:secretsmanager:us-east-1:111122223333:secret:secret-name"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AttachNetworkInterface",
                "ec2:CreateNetworkInterface",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:DeleteNetworkInterface",
                "ec2:DeleteNetworkInterfacePermission",
                "ec2:DetachNetworkInterface",
                "ec2:DescribeNetworkInterfaces"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeDhcpOptions",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        { 
            "Effect": "Allow",
            "Action": [ 
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:*:*:network-interface/*",
            "Condition": { 
               "StringEquals": 
                    {
                        "aws:RequestTag/OSISManaged": "true"
                    } 
            } 
        }
    ]
}
```

------

파이프라인은 이러한 권한을 사용하여 VPC에서 네트워크 인터페이스를 생성하고 삭제하므로 OpenSearch Ingestion 파이프라인을 생성하는 데 사용하는 IAM 역할에서 위의 Amazon EC2 권한을 제공해야 합니다. 파이프라인은 오직 이 네트워크 인터페이스를 통해 Kafka 클러스터에 액세스할 수 있습니다.

#### 2단계: 파이프라인 생성
<a name="self-managed-kafka-private-pipeline"></a>

이제 Kafka를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

여러 OpenSearch Service 도메인을 데이터의 대상으로 지정할 수 있습니다. 이 기능을 사용하여 조건부로 라우팅하거나 수신 데이터를 여러 OpenSearch Service 도메인으로 복제할 수 있습니다.

소스 Confluent Kafka의 데이터를 OpenSearch Serverless VPC 컬렉션으로 마이그레이션할 수도 있습니다. 파이프라인 구성 내에서 네트워크 액세스 정책을 제공해야 합니다. Confluent 스키마 레지스트리를 사용하여 Confluent 스키마를 정의할 수 있습니다.

```
 version: "2"
kafka-pipeline:
  source:
    kafka:
      encryption:
        type: "ssl"
      topics:
        - name: "topic-name"
          group_id: "group-id"
      bootstrap_servers:
        - "bootstrap-server.us-east-1.aws.private.confluent.cloud:9092"
      authentication:
        sasl:
          plain:
            username: ${aws_secrets:confluent-kafka-secret:username}
            password: ${aws_secrets:confluent-kafka-secret:password}
      schema:
        type: confluent
        registry_url: https://my-registry.us-east-1.aws.confluent.cloud
        api_key: "${{aws_secrets:schema-secret:schema_registry_api_key}}"
        api_secret: "${{aws_secrets:schema-secret:schema_registry_api_secret}}"
        basic_auth_credentials_source: "USER_INFO"
  sink:
  - opensearch:
      hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
      aws:
          region: "us-east-1"
      index: "confluent-index"
extension:
  aws:
    secrets:
      confluent-kafka-secret:
        secret_id: "my-kafka-secret"
        region: "us-east-1"
      schema-secret:
        secret_id: "my-self-managed-kafka-schema"
        region: "us-east-2"
```

# 에서 OpenSearch Ingestion 파이프라인 사용 Amazon Managed Streaming for Apache Kafka
<a name="configure-client-msk"></a>

[Kafka 플러그인](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/kafka/)을 사용하여 [Amazon Managed Streaming for Apache Kafka](https://docs.aws.amazon.com/msk/latest/developerguide/)(Amazon MSK)에서 OpenSearch Ingestion 파이프라인으로 데이터를 수집할 수 있습니다. Amazon MSK로 Apache Kafka를 사용하여 스트리밍 데이터를 처리하는 애플리케이션을 구축하고 실행할 수 있습니다. OpenSearch Ingestion은 AWS PrivateLink 를 사용하여 Amazon MSK에 연결합니다. Amazon MSK 및 Amazon MSK Serverless 클러스터 모두에서 데이터를 수집할 수 있습니다. 두 프로세스의 유일한 차이는 파이프라인을 설정하기 전에 수행해야 하는 사전 조건 단계입니다.

**Topics**
+ [프로비저닝된 Amazon MSK 사전 조건](#msk-prereqs)
+ [Amazon MSK Serverless 사전 조건](#msk-serverless-prereqs)
+ [1단계: 파이프라인 역할 구성](#msk-pipeline-role)
+ [2단계: 파이프라인 생성](#msk-pipeline)
+ [3단계: (선택 사항) AWS Glue 스키마 레지스트리 사용](#msk-glue)
+ [4단계: (선택 사항) Amazon MSK 파이프라인의 권장 컴퓨팅 유닛(OCU) 구성](#msk-ocu)

## 프로비저닝된 Amazon MSK 사전 조건
<a name="msk-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. **Amazon Managed Streaming for Apache Kafka 개발자 안내서의 [클러스터 생성](https://docs.aws.amazon.com/msk/latest/developerguide/msk-create-cluster.html#create-cluster-console)에 나온 단계를 수행하여 Amazon MSK 클러스터를 생성합니다. **브로커 유형**의 경우 OpenSearch Ingestion에서 지원되지 않으므로 `t3` 유형을 제외한 옵션을 선택합니다.

1. 클러스터가 **활성** 상태가 되면 [다중 VPC 연결 켜기](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access-mult-vpc.html#mvpc-cluster-owner-action-turn-on) 단계를 따르세요.

1. 클러스터와 파이프라인이 동일한 AWS 계정에 있는지 여부에 따라 [MSK 클러스터에 클러스터 정책 연결](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access-mult-vpc.html#mvpc-cluster-owner-action-policy)의 단계에 따라 다음 정책 중 하나를 연결합니다. 이 정책은 OpenSearch Ingestion이 Amazon MSK 클러스터에 대한 AWS PrivateLink 연결을 생성하고 Kafka 주제에서 데이터를 읽을 수 있도록 허용합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

   클러스터와 파이프라인이 동일한 AWS 계정에 있는 경우 다음 정책이 적용됩니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "osis.amazonaws.com"
         },
         "Action": [
           "kafka:CreateVpcConnection",
           "kafka:DescribeClusterV2"
         ],
         "Resource": "arn:aws:kafka:us-east-1:111122223333:cluster/cluster-name/cluster-id"
       },
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "osis-pipelines.amazonaws.com"
         },
         "Action": [
           "kafka:CreateVpcConnection",
           "kafka:GetBootstrapBrokers",
           "kafka:DescribeClusterV2"
         ],
         "Resource": "arn:aws:kafka:us-east-1:111122223333:cluster/cluster-name/cluster-id"
       }
     ]
   }
   ```

------

   Amazon MSK 클러스터가 파이프라인 AWS 계정 과 다른에 있는 경우 대신 다음 정책을 연결합니다. 교차 계정 액세스는 프로비저닝된 Amazon MSK 클러스터에서만 가능하며 Amazon MSK Serverless 클러스터에서는 불가능합니다. 의 AWS `principal` ARN은 파이프라인 구성에 제공하는 것과 동일한 파이프라인 역할에 대한 ARN이어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "osis.amazonaws.com"
         },
         "Action": [
           "kafka:CreateVpcConnection",
           "kafka:DescribeClusterV2"
         ],
         "Resource": "arn:aws:kafka:us-east-1:111122223333:cluster/cluster-name/cluster-id"
       },
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "osis-pipelines.amazonaws.com"
         },
         "Action": [
           "kafka:CreateVpcConnection",
           "kafka:GetBootstrapBrokers",
           "kafka:DescribeClusterV2"
         ],
         "Resource": "arn:aws:kafka:us-east-1:111122223333:cluster/cluster-name/cluster-id"
       },
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::444455556666:role/pipeline-role"
         },
         "Action": [
           "kafka-cluster:*",
           "kafka:*"
         ],
         "Resource": [
           "arn:aws:kafka:us-east-1:111122223333:cluster/cluster-name/cluster-id",
           "arn:aws:kafka:us-east-1:111122223333:topic/cluster-name/cluster-id/*",
           "arn:aws:kafka:us-east-1:111122223333:group/cluster-name/*"
         ]
       }
     ]
   }
   ```

------

1. [주제 생성](https://docs.aws.amazon.com/msk/latest/developerguide/create-topic.html)의 단계에 따라 Kafka 주제를 생성하세요. `BootstrapServerString`이 프라이빗 엔드포인트(단일 VPC) 부트스트랩 URL 중 하나인지 확인하세요. `--replication-factor`의 값은 Amazon MSK 클러스터의 영역 수에 따라 `2` 또는 `3`이어야 합니다. `--partitions`의 값은 최소 `10` 이상이어야 합니다.

1. [데이터 생산 및 소비](https://docs.aws.amazon.com/msk/latest/developerguide/produce-consume.html)의 단계에 따라 데이터를 생산하고 소비하세요. 다시, `BootstrapServerString`이 프라이빗 엔드포인트(단일 VPC) 부트스트랩 URL 중 하나인지 확인하세요.

## Amazon MSK Serverless 사전 조건
<a name="msk-serverless-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. *Amazon Managed Streaming for Apache Kafka 개발자 안내서*의 [클러스터 생성](https://docs.aws.amazon.com/msk/latest/developerguide/create-serverless-cluster.html#)에 있는 단계에 따라 Amazon MSK Serverless를 생성합니다.

1. 클러스터가 **활성** 상태이면 [Attach a cluster policy to the MSK cluster](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access-mult-vpc.html#mvpc-cluster-owner-action-policy)에 나온 단계를 수행하여 다음 정책을 연결합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "osis.amazonaws.com"
         },
         "Action": [
           "kafka:CreateVpcConnection",
           "kafka:DescribeClusterV2"
         ],
         "Resource": "arn:aws:kafka:us-east-1:111122223333:cluster/cluster-name/cluster-id"
       },
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "osis-pipelines.amazonaws.com"
         },
         "Action": [
           "kafka:CreateVpcConnection",
           "kafka:GetBootstrapBrokers",
           "kafka:DescribeClusterV2"
         ],
         "Resource": "arn:aws:kafka:us-east-1:111122223333:cluster/cluster-name/cluster-id"
       }
     ]
   }
   ```

------

   이 정책은 OpenSearch Ingestion이 Amazon MSK Serverless 클러스터에 대한 AWS PrivateLink 연결을 생성하고 Kafka 주제에서 데이터를 읽을 수 있도록 허용합니다. 이 정책은 클러스터와 파이프라인이 동일한에 있는 경우 적용되며 AWS 계정, Amazon MSK Serverless는 교차 계정 액세스를 지원하지 않으므로 true여야 합니다.

1. [주제 생성](https://docs.aws.amazon.com/msk/latest/developerguide/msk-serverless-create-topic.html)의 단계에 따라 Kafka 주제를 생성하세요. `BootstrapServerString`이 Simple Authentication and Security Layer(SASL) IAM 부트스트랩 URL 중 하나인지 확인합니다. `--replication-factor`의 값은 Amazon MSK Serverless 클러스터의 영역 수에 따라 `2` 또는 `3`이어야 합니다. `--partitions`의 값은 최소 `10` 이상이어야 합니다.

1. [데이터 생산 및 소비](https://docs.aws.amazon.com/msk/latest/developerguide/msk-serverless-produce-consume.html)의 단계에 따라 데이터를 생산하고 소비하세요. 다시 `BootstrapServerString`이 Simple Authentication and Security Layer(SASL) IAM 부트스트랩 URL 중 하나인지 확인합니다.

## 1단계: 파이프라인 역할 구성
<a name="msk-pipeline-role"></a>

Amazon MSK 프로비저닝 또는 서버리스 클러스터를 설정한 후 파이프라인 구성에서 사용하려는 파이프라인 역할에 다음 Kafka 권한을 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:Connect",
                "kafka-cluster:AlterCluster",
                "kafka-cluster:DescribeCluster",
                "kafka:DescribeClusterV2",
                "kafka:GetBootstrapBrokers"
            ],
            "Resource": [
                "arn:aws:kafka:us-east-1:111122223333:cluster/cluster-name/cluster-id"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:*Topic*",
                "kafka-cluster:ReadData"
            ],
            "Resource": [
                "arn:aws:kafka:us-east-1:111122223333:topic/cluster-name/cluster-id/topic-name"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kafka-cluster:AlterGroup",
                "kafka-cluster:DescribeGroup"
            ],
            "Resource": [
                "arn:aws:kafka:us-east-1:111122223333:group/cluster-name/*"
            ]
        }
    ]
}
```

------

## 2단계: 파이프라인 생성
<a name="msk-pipeline"></a>

그런 다음 Kafka를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

```
version: "2"
log-pipeline:
  source:
    kafka:
      acknowledgements: true
      topics:
      - name: "topic-name"
        group_id: "grouplambd-id"
      aws:
        msk:
          arn: "arn:aws:kafka:region:account-id:cluster/cluster-name/cluster-id"
        region: "us-west-2"
  processor:
  - grok:
      match:
        message:
        - "%{COMMONAPACHELOG}"
  - date:
      destination: "@timestamp"
      from_time_received: true
  sink:
  - opensearch:
      hosts: ["https://search-domain-endpoint.us-east-1es.amazonaws.com"]
      index: "index_name"
      aws_region: "region"
      aws_sigv4: true
```

사전 구성된 Amazon MSK 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

## 3단계: (선택 사항) AWS Glue 스키마 레지스트리 사용
<a name="msk-glue"></a>

Amazon MSK에서 OpenSearch Ingestion을 사용하는 경우 AWS Glue 스키마 레지스트리에서 호스팅되는 스키마에 AVRO 데이터 형식을 사용할 수 있습니다. [AWS Glue 스키마 레지스트리](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)를 사용하면 데이터 스트림 스키마를 중앙에서 검색, 제어 및 발전시킬 수 있습니다.

이 옵션을 사용하려면 파이프라인 구성에서 스키마 `type`를 활성화하세요.

```
schema:
  type: "aws_glue"
```

또한 파이프라인 역할에 AWS Glue 읽기 액세스 권한을 제공해야 합니다. [AWSGlueSchemaRegistryReadonlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSGlueSchemaRegistryReadonlyAccess.html)라는 AWS 관리형 정책을 사용할 수 있습니다. 또한 레지스트리는 OpenSearch Ingestion 파이프라인과 동일한 AWS 계정 및 리전에 있어야 합니다.

## 4단계: (선택 사항) Amazon MSK 파이프라인의 권장 컴퓨팅 유닛(OCU) 구성
<a name="msk-ocu"></a>

각 컴퓨팅 유닛에는 주제당 한 명의 소비자가 있습니다. 브로커는 특정 주제에 대해 이러한 소비자 간의 파티션을 조정합니다. 하지만 파티션 수가 소비자 수보다 많을 경우 Amazon MSK는 모든 소비자에게 여러 파티션을 호스팅합니다. OpenSearch Ingestion에는 CPU 사용량 또는 파이프라인에서 보류 중인 레코드 수에 따라 규모를 늘리거나 줄일 수 있는 auto-scaling 기능이 내장되어 있습니다.

성능을 최적화하려면 여러 컴퓨팅 유닛에 파티션을 분산하여 병렬 처리하세요. 주제에 많은 수의 파티션이 있는 경우(예: 파이프라인당 최대 OCU인 96개 초과), 1\$196개의 OCU로 파이프라인을 구성하는 것이 좋습니다. 필요에 따라 자동으로 크기가 조정되기 때문입니다. 주제의 파티션 수가 적은 경우(예: 96개 미만), 최대 컴퓨팅 유닛을 파티션 수와 동일하게 유지하세요.

파이프라인에 주제가 한 개 이상 있는 경우 파티션 수가 가장 많은 주제를 참조로 선택하여 최대 컴퓨팅 유닛을 구성하세요. 새 OCU 세트가 포함된 다른 파이프라인을 동일한 주제 및 소비자 그룹에 추가하면 처리량을 거의 선형적으로 확장할 수 있습니다.

# Amazon RDS에서 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-rds"></a>

Amazon RDS와 함께 OpenSearch Ingestion 파이프라인을 사용하여 기존 데이터를 내보내고 변경 사항(예: 생성, 업데이트 및 삭제)을 Amazon OpenSearch Service 도메인 및 컬렉션으로 스트리밍할 수 있습니다. OpenSearch Ingestion 파이프라인은 변경 데이터 캡처(CDC) 인프라를 통합하여 지연 시간을 최소화하면서 대규모로 Amazon RDS에서 데이터를 지속적으로 스트리밍할 수 있도록 합니다. RDS for MySQL 및 RDS for PostgreSQL이 지원됩니다.

Amazon RDS를 데이터 처리를 위한 소스로 사용하는 두 가지 방법(전체 초기 스냅샷 사용 또는 사용 안 함)이 있습니다. 전체 초기 스냅샷은 지정된 테이블의 스냅샷이며, 이 스냅샷은 Amazon S3로 내보내집니다. 그러면 OpenSearch Ingestion 파이프라인이 이 스냅샷을 도메인의 한 인덱스로 보내거나 분할하여 도메인의 여러 인덱스로 보냅니다. Amazon RDS와 OpenSearch의 데이터를 일관되게 유지하기 위해 파이프라인에서는 Amazon RDS 인스턴스의 테이블에 있는 모든 생성, 업데이트 및 삭제 이벤트를 하나 이상의 OpenSearch 인덱스에 저장된 문서와 동기화합니다.

전체 초기 스냅샷을 사용하는 경우 OpenSearch Ingestion 파이프라인에서는 먼저 스냅샷을 수집한 다음, Amazon RDS 변경 스트림에서 데이터를 읽기 시작합니다. 실제로 처리의 시간 차이가 거의 없기 때문에 Amazon RDS와 OpenSearch 간에 실시간에 가까운 데이터 일관성이 유지됩니다.

또한 Amazon RDS와의 OpenSearch Ingestion 통합을 사용하여 변경 데이터 캡처를 추적하고 Aurora에서 OpenSearch로의 모든 업데이트를 수집할 수 있습니다. 다른 메커니즘의 전체 스냅샷이 이미 있거나 Amazon RDS 인스턴스의 데이터에 대한 모든 변경 사항을 캡처하려는 경우 이 옵션을 선택합니다.

이 옵션을 선택하면 [Amazon RDS for MySQL 바이너리 로깅을 구성](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.MySQL.BinaryFormat.html)하거나 [Amazon RDS for PostgresSQL DB 인스턴스에 대한 논리적 복제를 설정](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.pglogical.setup-replication.html)해야 합니다.

**Topics**
+ [RDS for MySQL](rds-mysql.md)
+ [RDS for PostgreSQL](rds-PostgreSQL.md)

# RDS for MySQL
<a name="rds-mysql"></a>

Amazon RDS for RDS for MySQL을 사용하여 OpenSearch Ingestion 파이프라인을 구성하려면 다음 단계를 완료합니다.

**Topics**
+ [RDS for MySQL 사전 조건](#rds-mysql-prereqs)
+ [1단계: 파이프라인 역할 구성](#rds-mysql-pipeline-role)
+ [2단계: 파이프라인 생성](#rds-mysql-pipeline)
+ [데이터 일관성](#rds-mysql-pipeline-consistency)
+ [데이터 형식 매핑](#rds-mysql-pipeline-mapping)
+ [제한 사항](#rds-mysql-pipeline-limitations)
+ [권장되는 CloudWatch 경보](#aurora-mysql-pipeline-metrics)

## RDS for MySQL 사전 조건
<a name="rds-mysql-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. Amazon RDS에서 사용자 지정 DB 파라미터 그룹을 생성하여 바이너리 로깅을 구성하고 다음 파라미터를 설정합니다.

   ```
   binlog_format=ROW
   binlog_row_image=full
   binlog_row_metadata=FULL
   ```

   또한 `binlog_row_value_options` 파라미터가 `PARTIAL_JSON`으로 설정되어 있지 않아야 합니다.

   자세한 내용은 [RDS for MySQL 이진 로깅 구성](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.MySQL.BinaryFormat.html)을 참조하세요.

1. [RDS for MySQL DB 인스턴스를 선택하거나 생성하고](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html) 이전 단계에서 생성한 파라미터 그룹을 DB 인스턴스와 연결합니다.

1. 데이터베이스에서 자동 백업이 활성화되어 있는지 확인합니다. 자세한 내용은 [자동 백업 활성화](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.Enabling.html)를 참조하세요.

1. 예를 들어 복제가 발생하기에 충분한 시간(예: 24시간)으로 바이너리 로그 보존을 구성합니다. 자세한 내용은 *Amazon RDS 사용 설명서*의 [이진수 로그 구성 설정 및 표시](https://docs.aws.amazon.com//AmazonRDS/latest/UserGuide/mysql-stored-proc-configuring.html)를 참조하세요.

1. [Amazon RDS 및 AWS Secrets Manager에서 암호 관리를 사용](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html)하여 Amazon RDS 인스턴스에서 사용자 이름과 암호 인증을 설정합니다. [Secrets Manager 보안 암호를 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)하여 사용자 이름/암호 조합을 생성할 수도 있습니다.

1. 전체 초기 스냅샷 기능을 사용하는 경우 Amazon RDS에서 Amazon S3로 데이터를 내보내기 위한 AWS KMS key 및 IAM 역할을 생성합니다.

   이 IAM 역할에는 다음과 같은 권한 정책도 있어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ExportPolicy",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject*",
                   "s3:ListBucket",
                   "s3:GetObject*",
                   "s3:DeleteObject*",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::s3-bucket-used-in-pipeline",
                   "arn:aws:s3:::s3-bucket-used-in-pipeline/*"
               ]
           }
       ]
   }
   ```

------

   이 역할에는 다음과 같은 신뢰 관계도 있어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "export.rds.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 선택하거나 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains) 및 [컬렉션 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html#serverless-create)을 참조하세요.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 Amazon RDS DB 인스턴스의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

## 1단계: 파이프라인 역할 구성
<a name="rds-mysql-pipeline-role"></a>

Amazon RDS 파이프라인 사전 조건을 설정한 후 [파이프라인 구성에 사용할 파이프라인 역할을 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-sink)합니다. 또한 Amazon RDS 소스에 대한 다음 권한을 역할에 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
    "Sid": "allowReadingFromS3Buckets",
    "Effect": "Allow",
    "Action": [
    "s3:GetObject",
    "s3:DeleteObject",
    "s3:GetBucketLocation",
    "s3:ListBucket",
    "s3:PutObject"
    ],
    "Resource": [
    "arn:aws:s3:::s3_bucket",
    "arn:aws:s3:::s3_bucket/*"
    ]
    },
    {
    "Sid": "allowNetworkInterfacesActions",
    "Effect": "Allow",
    "Action": [
    "ec2:AttachNetworkInterface",
    "ec2:CreateNetworkInterface",
    "ec2:CreateNetworkInterfacePermission",
    "ec2:DeleteNetworkInterface",
    "ec2:DeleteNetworkInterfacePermission",
    "ec2:DetachNetworkInterface",
    "ec2:DescribeNetworkInterfaces"
    ],
    "Resource": [
    "arn:aws:ec2:*:111122223333:network-interface/*",
    "arn:aws:ec2:*:111122223333:subnet/*",
    "arn:aws:ec2:*:111122223333:security-group/*"
    ]
    },
    {
    "Sid": "allowDescribeEC2",
    "Effect": "Allow",
    "Action": [
    "ec2:Describe*"
    ],
    "Resource": "*"
    },
    {
    "Sid": "allowTagCreation",
    "Effect": "Allow",
    "Action": [
    "ec2:CreateTags"
    ],
    "Resource": "arn:aws:ec2:*:111122223333:network-interface/*",
    "Condition": {
    "StringEquals": {
    "aws:RequestTag/OSISManaged": "true"
    }
    }
    },
    {
    "Sid": "AllowDescribeInstances",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBInstances"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:db:*"
    ]
    },
    {
    "Sid": "AllowSnapshots",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBSnapshots",
    "rds:CreateDBSnapshot",
    "rds:AddTagsToResource"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:db:DB-id",
    "arn:aws:rds:us-east-2:111122223333:snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowExport",
    "Effect": "Allow",
    "Action": [
    "rds:StartExportTask"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowDescribeExports",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeExportTasks"
    ],
    "Resource": "*",
    "Condition": {
    "StringEquals": {
    "aws:RequestedRegion": "us-east-2",
    "aws:ResourceAccount": "111122223333"
    }
    }
    },
    {
    "Sid": "AllowAccessToKmsForExport",
    "Effect": "Allow",
    "Action": [
    "kms:Decrypt",
    "kms:Encrypt",
    "kms:DescribeKey",
    "kms:RetireGrant",
    "kms:CreateGrant",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*"
    ],
    "Resource": [
    "arn:aws:kms:us-east-2:111122223333:key/export-key-id"
    ]
    },
    {
    "Sid": "AllowPassingExportRole",
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": [
    "arn:aws:iam::111122223333:role/export-role"
    ]
    },
    {
    "Sid": "SecretsManagerReadAccess",
    "Effect": "Allow",
    "Action": [
    "secretsmanager:GetSecretValue"
    ],
    "Resource": [
    "arn:aws:secretsmanager:*:111122223333:secret:*"
    ]
    }
    ]
    }
```

------

## 2단계: 파이프라인 생성
<a name="rds-mysql-pipeline"></a>

다음과 유사한 OpenSearch Ingestion 파이프라인을 구성합니다. 이 파이프라인 예는 Amazon RDS 인스턴스를 소스로 지정합니다.

```
version: "2"
rds-mysql-pipeline:
  source:
    rds:
      db_identifier: "instance-id"
      engine: mysql
      database: "database-name"
      tables:
        include:
          - "table1"
          - "table2"
      s3_bucket: "bucket-name"
      s3_region: "bucket-region"
      s3_prefix: "prefix-name"
      export:
        kms_key_id: "kms-key-id"
        iam_role_arn: "export-role-arn"
      stream: true
      aws:
        sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
        region: "us-east-1"
      authentication:
        username: ${{aws_secrets:secret:username}}
        password: ${{aws_secrets:secret:password}}
  sink:
    - opensearch:
        hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
        index: "${getMetadata(\"table_name\")}"
        index_type: custom
        document_id: "${getMetadata(\"primary_key\")}"
        action: "${getMetadata(\"opensearch_action\")}"
        document_version: "${getMetadata(\"document_version\")}"
        document_version_type: "external"
        aws:
          sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
          region: "us-east-1"
extension:
  aws:
    secrets:
      secret:
        secret_id: "rds-secret-id"
        region: "us-east-1"
        sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
        refresh_interval: PT1H
```

사전 구성된 Amazon RDS 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

Amazon Aurora를 소스로 사용하려면 파이프라인에 대한 VPC 액세스를 구성해야 합니다. 선택한 VPC는 Amazon Aurora 소스에서 사용하는 것과 동일한 VPC여야 합니다. 그런 다음 하나 이상의 서브넷과 하나 이상의 VPC 보안 그룹을 선택합니다. 파이프라인에는 Aurora MySQL 데이터베이스에 대한 네트워크 액세스가 필요하므로 Aurora 클러스터가 파이프라인의 VPC 보안 그룹에서 데이터베이스 포트로의 인바운드 트래픽을 허용하는 VPC 보안 그룹으로 구성되어 있는지도 확인해야 합니다. 자세한 내용은 [보안 그룹을 통한 액세스 제어](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Overview.RDSSecurityGroups.html)를 참조하세요.

를 사용하여 파이프라인 AWS Management Console 을 생성하는 경우 Amazon Aurora를 소스로 사용하려면 VPC에 파이프라인도 연결해야 합니다. 이를 수행하려면 **네트워크 구성** 섹션을 찾아 **VPC에 연결**을 선택하고 제공된 기본 옵션 중 하나에서 CIDR을 선택하거나 자체 CIDR을 선택합니다. [RFC 1918 Best Current Practice](https://datatracker.ietf.org/doc/html/rfc1918)에 정의된 대로 프라이빗 주소 공간에서 모든 CIDR을 사용할 수 있습니다.

사용자 지정 CIDR을 제공하려면 드롭다운 메뉴에서 **기타**를 선택합니다. OpenSearch Ingestion과 Amazon RDS 간의 IP 주소 충돌을 방지하려면 Amazon RDS VPC CIDR이 OpenSearch Ingestion의 CIDR과 달라야 합니다.

자세한 내용은 [파이프라인에 대한 VPC 액세스 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security.html#pipeline-vpc-configure)을 참조하세요.

## 데이터 일관성
<a name="rds-mysql-pipeline-consistency"></a>

파이프라인은 Amazon RDS 인스턴스의 변경 사항을 지속적으로 폴링하거나 수신하고 OpenSearch 인덱스에서 해당 문서를 업데이트하여 데이터 일관성을 보장합니다.

OpenSearch Ingestion은 데이터 내구성을 보장하는 엔드 투 엔드 승인을 지원합니다. 파이프라인에서는 스냅샷이나 스트림을 읽을 때 병렬 처리를 위해 동적으로 분할을 생성합니다. 파이프라인에서는 OpenSearch 도메인이나 컬렉션에서 모든 레코드를 수집한 후 승인을 받으면 분할을 완료 상태로 표시합니다. OpenSearch Serverless 검색 컬렉션에 수집하려는 경우 파이프라인에서 문서 ID를 생성할 수 있습니다. OpenSearch Serverless 시계열 컬렉션에 수집하려면 파이프라인이 문서 ID를 생성하지 않으므로 파이프라인 싱크 구성`document_id: "${getMetadata(\"primary_key\")}"`에서를 생략해야 합니다.

또한 OpenSearch Ingestion 파이프라인에서는 수신 이벤트 작업을 해당하는 대량 인덱싱 작업에 매핑하여 문서를 쉽게 수집할 수 있게 합니다. 이렇게 하면 데이터 일관성이 유지되므로 Amazon RDS의 모든 데이터 변경 사항이 OpenSearch에서 해당하는 문서 변경 사항으로 조정됩니다.

## 데이터 형식 매핑
<a name="rds-mysql-pipeline-mapping"></a>

OpenSearch Ingestion 파이프라인은 OpenSearch Service 도메인 또는 컬렉션이 사용할 수 있는 표현에 MySQL 데이터 유형을 매핑합니다. OpenSearch에 매핑 템플릿이 정의되지 않은 경우 OpenSearch는 처음 전송된 문서를 기반으로 [동적 매핑](https://docs.opensearch.org/latest/field-types/#dynamic-mapping)을 사용하여 필드 유형을 자동으로 결정합니다. 매핑 템플릿을 통해 OpenSearch에서 가장 적합한 필드 유형을 명시적으로 정의할 수도 있습니다.

아래 표에는 MySQL 데이터 유형과 해당 OpenSearch 필드 유형이 나열되어 있습니다. 명시적 매핑이 정의되지 않은 경우 *기본 OpenSearch 필드 유형* 열에 OpenSearch의 해당 필드 유형이 표시됩니다. 이 경우 OpenSearch는 동적 매핑을 사용하여 필드 유형을 자동으로 결정합니다. *권장 OpenSearch 필드 유형* 열은 매핑 템플릿에서 명시적으로 지정하도록 권장되는 해당 필드 유형입니다. 이들 필드 유형은 MySQL의 데이터 유형과 더 긴밀하게 맞춤화되며 일반적으로 OpenSearch에서 사용할 수 있는 더 나은 검색 기능을 지원할 수 있습니다.


| MySQL 데이터 형식 | 기본 OpenSearch 필드 유형 | 권장 OpenSearch 필드 유형 | 
| --- | --- | --- | 
| BIGINT | long | long | 
| BIGINT UNSIGNED | long | unsigned long | 
| BIT | long | 비트 수에 따라 byte, short, integer 또는 long입니다. | 
| DECIMAL | 텍스트 | double 또는 키워드 | 
| DOUBLE | 실수 | double | 
| FLOAT | 실수 | 실수 | 
| INT | long | 정수 | 
| INT UNSIGNED | long | long | 
| MEDIUMINT | long | 정수 | 
| MEDIUMINT UNSIGNED | long | 정수 | 
| NUMERIC | 텍스트 | double 또는 키워드 | 
| SMALLINT | long | bigint | 
| SMALLINT UNSIGNED | long | 정수 | 
| TINYINT | long | 바이트 | 
| TINYINT UNSIGNED | long | bigint | 
| BINARY | 텍스트 | 이진수 | 
| BLOB | 텍스트 | 이진수 | 
| CHAR | 텍스트 | 텍스트 | 
| ENUM | 텍스트 | 키워드 | 
| LONGBLOB | 텍스트 | 이진수 | 
| LONGTEXT | 텍스트 | 텍스트 | 
| MEDIUMBLOB | 텍스트 | 이진수 | 
| MEDIUMTEXT | 텍스트 | 텍스트 | 
| SET | 텍스트 | 키워드 | 
| TEXT | 텍스트 | 텍스트 | 
| TINYBLOB | 텍스트 | 이진수 | 
| TINYTEXT | 텍스트 | 텍스트 | 
| VARBINARY | 텍스트 | 이진수 | 
| VARCHAR | 텍스트 | 텍스트 | 
| DATE | long(에포크 밀리초) | 날짜 | 
| DATETIME | long(에포크 밀리초) | 날짜 | 
| TIME | long(에포크 밀리초) | 날짜 | 
| TIMESTAMP | long(에포크 밀리초) | 날짜 | 
| YEAR | long(에포크 밀리초) | 날짜 | 
| GEOMETRY | text(WKT 형식) | geo\$1shape | 
| GEOMETRYCOLLECTION | text(WKT 형식) | geo\$1shape | 
| LINESTRING | text(WKT 형식) | geo\$1shape | 
| MULTILINESTRING | text(WKT 형식) | geo\$1shape | 
| MULTIPOINT | text(WKT 형식) | geo\$1shape | 
| MULTIPOLYGON | text(WKT 형식) | geo\$1shape | 
| POINT | text(WKT 형식) | geo\$1point 또는 geo\$1shape | 
| POLYGON | text(WKT 형식) | geo\$1shape | 
| JSON | 텍스트 | 객체 | 

OpenSearch Ingestion 파이프라인에서 DLQ(Dead Letter Queue)를 구성하는 것이 좋습니다. 이 대기열을 구성하면 OpenSearch Service에서는 동적 매핑 실패로 인해 수집할 수 없는 모든 실패한 문서를 대기열로 전송합니다.

자동 매핑이 실패하면 파이프라인 구성에서 `template_type` 및 `template_content`를 사용하여 명시적 매핑 규칙을 정의할 수 있습니다. 또는 파이프라인을 시작하기 전에 검색 도메인이나 컬렉션에서 직접 매핑 템플릿을 생성할 수도 있습니다.

## 제한 사항
<a name="rds-mysql-pipeline-limitations"></a>

RDS for MySQL용 OpenSearch Ingestion 파이프라인을 설정하는 경우 다음과 같은 제한 사항을 고려하세요.
+ 이 통합에서는 파이프라인당 하나의 MySQL 데이터베이스만 지원합니다.
+ 이 통합에서는 현재 교차 리전 데이터 수집을 지원하지 않습니다. Amazon RDS 인스턴스와 OpenSearch 도메인은 동일한 AWS 리전에 있어야 합니다.
+ 이 통합에서는 현재 교차 계정 데이터 수집을 지원하지 않습니다. Amazon RDS 인스턴스와 OpenSearch Ingestion 파이프라인은 동일한 AWS 계정에 있어야 합니다.
+ 지원되는 유일한 인증 메커니즘인 Secrets Manager를 사용한 인증이 Amazon RDS 인스턴스에 활성화되어 있는지 확인합니다.
+ 기존 파이프라인 구성은 다른 데이터베이스 및/또는 다른 테이블에서 데이터를 수집하도록 업데이트할 수 없습니다. 파이프라인의 데이터베이스 및/또는 테이블 이름을 업데이트하려면 새 파이프라인을 생성해야 합니다.
+ 데이터 정의 언어(DDL) 문은 일반적으로 지원되지 않습니다. 다음의 경우에는 데이터 일관성이 유지되지 않습니다.
  + 기본 키가 변경될 경우(추가/삭제/이름 변경)
  + 테이블이 삭제되거나 잘린 경우.
  + 열 이름 또는 데이터 형식이 변경된 경우.
+ 동기화할 MySQL 테이블에 기본 키가 정의되지 않은 경우 데이터 일관성이 보장되지 않습니다. 업데이트/삭제를 OpenSearch에 동기화하려면 OpenSearch 싱크 구성에서 사용자 지정 `document_id` 옵션을 올바르게 정의해야 합니다.
+ 계단식 삭제 작업이 있는 외래 키 참조는 지원되지 않으며, RDS for MySQL과 OpenSearch 간에 데이터 불일치가 발생할 수 있습니다.
+ Amazon RDS 다중 가용 영역 DB 클러스터는 지원되지 않습니다.
+ 지원되는 버전: MySQL 버전 8.0 이상

## 권장되는 CloudWatch 경보
<a name="aurora-mysql-pipeline-metrics"></a>

수집 파이프라인의 성능을 모니터링하려면 다음 CloudWatch 지표가 권장됩니다. 이러한 지표는 내보내기에서 처리된 데이터의 양, 스트림에서 처리된 이벤트의 수, 내보내기 및 스트림 이벤트 처리 오류, 대상에 쓴 문서 수를 식별하는 데 도움이 될 수 있습니다. 이러한 지표 중 하나가 지정된 시간 동안 지정된 값을 초과하면 작업을 수행하도록 CloudWatch 경보를 설정할 수 있습니다.


| 지표 | 설명 | 
| --- | --- | 
| pipeline-name.rds.credentialsChanged | 이 지표는 AWS 보안 암호 교체 빈도를 나타냅니다. | 
| pipeline-name.rds.executorRefreshErrors | 이 지표는 AWS 보안 암호 새로 고침 실패를 나타냅니다. | 
| pipeline-name.rds.exportRecordsTotal | 이 지표는 Amazon Aurora에서 내보낸 레코드 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 레코드 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordProcessingErrors | 이 지표는 Amazon Aurora 클러스터에서 데이터를 읽는 동안 OpenSearch Ingestion 파이프라인에서 처리한 오류 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsSuccessTotal | 이 지표는 성공적으로 처리한 내보내기 레코드의 총 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsFailedTotal | 이 지표는 처리하지 못한 내보내기 레코드의 총 수를 나타냅니다. | 
| pipeline-name.rds.bytesReceived | 이 지표는 OpenSearch Ingestion 파이프라인에서 수신한 총 바이트 수를 나타냅니다. | 
| pipeline-name.rds.bytesProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 총 바이트 수를 나타냅니다. | 
| pipeline-name.rds.streamRecordsSuccessTotal | 이 지표는 스트림에서 성공적으로 처리한 레코드 수를 나타냅니다. | 
| pipeline-name.rds.streamRecordsFailedTotal | 이 지표는 스트림에서 처리하지 못한 총 레코드 수를 나타냅니다. | 

# RDS for PostgreSQL
<a name="rds-PostgreSQL"></a>

Amazon RDS for RDS for PostgreSQL을 사용하여 OpenSearch Ingestion 파이프라인을 구성하려면 다음 단계를 완료합니다.

**Topics**
+ [RDS for PostgreSQL 사전 조건](#rds-PostgreSQL-prereqs)
+ [1단계: 파이프라인 역할 구성](#rds-mysql-pipeline-role)
+ [2단계: 파이프라인 생성](#rds-PostgreSQL-pipeline)
+ [데이터 일관성](#rds-mysql-pipeline-consistency)
+ [데이터 형식 매핑](#rds-PostgreSQL-pipeline-mapping)
+ [제한 사항](#rds-PostgreSQL-pipeline-limitations)
+ [권장되는 CloudWatch 경보](#aurora-mysql-pipeline-metrics)

## RDS for PostgreSQL 사전 조건
<a name="rds-PostgreSQL-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. Amazon RDS에서 [사용자 지정 DB 파라미터 그룹을 생성](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/zero-etl.setting-up.html#zero-etl.parameters)하여 논리적 복제를 구성합니다.

   ```
   rds.logical_replication=1
   ```

   자세한 내용은 [Amazon RDS for PostgreSQL에 대한 논리적 복제 수행](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Concepts.General.FeatureSupport.LogicalReplication.html)을 참조하세요.

1. [RDS for PostgreSQL DB 인스턴스를 선택하거나 생성하고](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.PostgreSQL.html) 1단계에서 생성한 파라미터 그룹을 DB 인스턴스와 연결합니다.

1. [Aurora 및 AWS Secrets Manager에서 암호 관리를 사용](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html)하여 Amazon RDS 인스턴스에서 사용자 이름과 암호 인증을 설정합니다. [Secrets Manager 보안 암호를 생성](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)하여 사용자 이름/암호 조합을 생성할 수도 있습니다.

1. 전체 초기 스냅샷 기능을 사용하는 경우 Amazon RDS에서 Amazon S3로 데이터를 내보내기 위한 AWS KMS key 및 IAM 역할을 생성합니다.

   이 IAM 역할에는 다음과 같은 권한 정책도 있어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ExportPolicy",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject*",
                   "s3:ListBucket",
                   "s3:GetObject*",
                   "s3:DeleteObject*",
                   "s3:GetBucketLocation"
               ],
               "Resource": [
                   "arn:aws:s3:::s3-bucket-used-in-pipeline",
                   "arn:aws:s3:::s3-bucket-used-in-pipeline/*"
               ]
           }
       ]
   }
   ```

------

   이 역할에는 다음과 같은 신뢰 관계도 있어야 합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "export.rds.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 선택하거나 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains) 및 [컬렉션 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html#serverless-create)을 참조하세요.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 Amazon RDS DB 인스턴스의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

## 1단계: 파이프라인 역할 구성
<a name="rds-mysql-pipeline-role"></a>

Amazon RDS 파이프라인 사전 조건을 설정한 후 [파이프라인 구성에 사용할 파이프라인 역할을 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-sink)합니다. 또한 Amazon RDS 소스에 대한 다음 권한을 역할에 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
    {
    "Sid": "allowReadingFromS3Buckets",
    "Effect": "Allow",
    "Action": [
    "s3:GetObject",
    "s3:DeleteObject",
    "s3:GetBucketLocation",
    "s3:ListBucket",
    "s3:PutObject"
    ],
    "Resource": [
    "arn:aws:s3:::s3_bucket",
    "arn:aws:s3:::s3_bucket/*"
    ]
    },
    {
    "Sid": "allowNetworkInterfacesActions",
    "Effect": "Allow",
    "Action": [
    "ec2:AttachNetworkInterface",
    "ec2:CreateNetworkInterface",
    "ec2:CreateNetworkInterfacePermission",
    "ec2:DeleteNetworkInterface",
    "ec2:DeleteNetworkInterfacePermission",
    "ec2:DetachNetworkInterface",
    "ec2:DescribeNetworkInterfaces"
    ],
    "Resource": [
    "arn:aws:ec2:*:111122223333:network-interface/*",
    "arn:aws:ec2:*:111122223333:subnet/*",
    "arn:aws:ec2:*:111122223333:security-group/*"
    ]
    },
    {
    "Sid": "allowDescribeEC2",
    "Effect": "Allow",
    "Action": [
    "ec2:Describe*"
    ],
    "Resource": "*"
    },
    {
    "Sid": "allowTagCreation",
    "Effect": "Allow",
    "Action": [
    "ec2:CreateTags"
    ],
    "Resource": "arn:aws:ec2:*:111122223333:network-interface/*",
    "Condition": {
    "StringEquals": {
    "aws:RequestTag/OSISManaged": "true"
    }
    }
    },
    {
    "Sid": "AllowDescribeInstances",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBInstances"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:db:*"
    ]
    },
    {
    "Sid": "AllowSnapshots",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeDBSnapshots",
    "rds:CreateDBSnapshot",
    "rds:AddTagsToResource"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:db:DB-id",
    "arn:aws:rds:us-east-2:111122223333:snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowExport",
    "Effect": "Allow",
    "Action": [
    "rds:StartExportTask"
    ],
    "Resource": [
    "arn:aws:rds:us-east-2:111122223333:snapshot:DB-id*"
    ]
    },
    {
    "Sid": "AllowDescribeExports",
    "Effect": "Allow",
    "Action": [
    "rds:DescribeExportTasks"
    ],
    "Resource": "*",
    "Condition": {
    "StringEquals": {
    "aws:RequestedRegion": "us-east-2",
    "aws:ResourceAccount": "111122223333"
    }
    }
    },
    {
    "Sid": "AllowAccessToKmsForExport",
    "Effect": "Allow",
    "Action": [
    "kms:Decrypt",
    "kms:Encrypt",
    "kms:DescribeKey",
    "kms:RetireGrant",
    "kms:CreateGrant",
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*"
    ],
    "Resource": [
    "arn:aws:kms:us-east-2:111122223333:key/export-key-id"
    ]
    },
    {
    "Sid": "AllowPassingExportRole",
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": [
    "arn:aws:iam::111122223333:role/export-role"
    ]
    },
    {
    "Sid": "SecretsManagerReadAccess",
    "Effect": "Allow",
    "Action": [
    "secretsmanager:GetSecretValue"
    ],
    "Resource": [
    "arn:aws:secretsmanager:*:111122223333:secret:*"
    ]
    }
    ]
    }
```

------

## 2단계: 파이프라인 생성
<a name="rds-PostgreSQL-pipeline"></a>

RDS for PostgreSQL 인스턴스를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

```
version: "2"
rds-postgres-pipeline:
  source:
    rds:
      db_identifier: "instance-id"
      engine: postgresql
      database: "database-name"
      tables:
        include:
          - "schema1.table1"
          - "schema2.table2"
      s3_bucket: "bucket-name"
      s3_region: "bucket-region"
      s3_prefix: "prefix-name"
      export:
        kms_key_id: "kms-key-id"
        iam_role_arn: "export-role-arn"
      stream: true
      aws:
        sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
        region: "us-east-1"
      authentication:
        username: ${{aws_secrets:secret:username}}
        password: ${{aws_secrets:secret:password}}
  sink:
    - opensearch:
        hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
        index: "${getMetadata(\"table_name\")}"
        index_type: custom
        document_id: "${getMetadata(\"primary_key\")}"
        action: "${getMetadata(\"opensearch_action\")}"
        document_version: "${getMetadata(\"document_version\")}"
        document_version_type: "external"
        aws:
          sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
          region: "us-east-1"
extension:
  aws:
    secrets:
      secret:
        secret_id: "rds-secret-id"
        region: "us-east-1"
        sts_role_arn: "arn:aws:iam::account-id:role/pipeline-role"
        refresh_interval: PT1H
```

**참고**  
사전 구성된 Amazon RDS 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

Amazon Aurora를 소스로 사용하려면 파이프라인에 대한 VPC 액세스를 구성해야 합니다. 선택한 VPC는 Amazon Aurora 소스에서 사용하는 것과 동일한 VPC여야 합니다. 그런 다음 하나 이상의 서브넷과 하나 이상의 VPC 보안 그룹을 선택합니다. 파이프라인에는 Aurora MySQL 데이터베이스에 대한 네트워크 액세스가 필요하므로 Aurora 클러스터가 파이프라인의 VPC 보안 그룹에서 데이터베이스 포트로의 인바운드 트래픽을 허용하는 VPC 보안 그룹으로 구성되어 있는지도 확인해야 합니다. 자세한 내용은 [보안 그룹을 통한 액세스 제어](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Overview.RDSSecurityGroups.html)를 참조하세요.

를 사용하여 파이프라인 AWS Management Console 을 생성하는 경우 Amazon Aurora를 소스로 사용하려면 VPC에 파이프라인도 연결해야 합니다. 이를 수행하려면 **네트워크 구성** 섹션을 찾아 **VPC에 연결**을 선택하고 제공된 기본 옵션 중 하나에서 CIDR을 선택하거나 자체 CIDR을 선택합니다. [RFC 1918 Best Current Practice](https://datatracker.ietf.org/doc/html/rfc1918)에 정의된 대로 프라이빗 주소 공간에서 모든 CIDR을 사용할 수 있습니다.

사용자 지정 CIDR을 제공하려면 드롭다운 메뉴에서 **기타**를 선택합니다. OpenSearch Ingestion과 Amazon RDS 간의 IP 주소 충돌을 방지하려면 Amazon Aurora VPC CIDR이 OpenSearch Ingestion의 CIDR과 달라야 합니다.

자세한 내용은 [파이프라인에 대한 VPC 액세스 구성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security.html#pipeline-vpc-configure)을 참조하세요.

## 데이터 일관성
<a name="rds-mysql-pipeline-consistency"></a>

파이프라인은 Amazon RDS 인스턴스의 변경 사항을 지속적으로 폴링하거나 수신하고 OpenSearch 인덱스에서 해당 문서를 업데이트하여 데이터 일관성을 보장합니다.

OpenSearch Ingestion은 데이터 내구성을 보장하는 엔드 투 엔드 승인을 지원합니다. 파이프라인에서는 스냅샷이나 스트림을 읽을 때 병렬 처리를 위해 동적으로 분할을 생성합니다. 파이프라인에서는 OpenSearch 도메인이나 컬렉션에서 모든 레코드를 수집한 후 승인을 받으면 분할을 완료 상태로 표시합니다. OpenSearch Serverless 검색 컬렉션에 수집하려는 경우 파이프라인에서 문서 ID를 생성할 수 있습니다. OpenSearch Serverless 시계열 컬렉션에 수집하려면 파이프라인이 문서 ID를 생성하지 않으므로 파이프라인 싱크 구성`document_id: "${getMetadata(\"primary_key\")}"`에서를 생략해야 합니다.

또한 OpenSearch Ingestion 파이프라인에서는 수신 이벤트 작업을 해당하는 대량 인덱싱 작업에 매핑하여 문서를 쉽게 수집할 수 있게 합니다. 이렇게 하면 데이터 일관성이 유지되므로 Amazon RDS의 모든 데이터 변경 사항이 OpenSearch에서 해당하는 문서 변경 사항으로 조정됩니다.

## 데이터 형식 매핑
<a name="rds-PostgreSQL-pipeline-mapping"></a>

OpenSearch Ingestion 파이프라인은 OpenSearch Service 도메인 또는 컬렉션이 사용할 수 있는 표현에 PostgreSQL 데이터 유형을 매핑합니다. OpenSearch에 매핑 템플릿이 정의되지 않은 경우 OpenSearch는 처음 전송된 문서를 기반으로 [동적 매핑](https://docs.opensearch.org/latest/field-types/#dynamic-mapping)을 사용하여 필드 유형을 자동으로 결정합니다. 매핑 템플릿을 통해 OpenSearch에서 가장 적합한 필드 유형을 명시적으로 정의할 수도 있습니다.

아래 표에는 RDS for PostgreSQL 데이터 유형과 해당 OpenSearch 필드 유형이 나열되어 있습니다. 명시적 매핑이 정의되지 않은 경우 *기본 OpenSearch 필드 유형* 열에 OpenSearch의 해당 필드 유형이 표시됩니다. 이 경우 OpenSearch는 동적 매핑을 사용하여 필드 유형을 자동으로 결정합니다. *권장 OpenSearch 필드 유형* 열은 매핑 템플릿에서 명시적으로 지정하는 해당 권장 필드 유형입니다. 이들 필드 유형은 RDS for PostgreSQL의 데이터 유형과 더 긴밀하게 맞춤화되며 일반적으로 OpenSearch에서 사용할 수 있는 더 나은 검색 기능을 지원할 수 있습니다.


| RDS for PostgreSQL 데이터 유형 | 기본 OpenSearch 필드 유형 | 권장 OpenSearch 필드 유형 | 
| --- | --- | --- | 
| smallint | long | bigint | 
| 정수 | long | 정수 | 
| bigint | long | long | 
| decimal | 텍스트 | double 또는 키워드 | 
| numeric[ (p, s) ] | 텍스트 | double 또는 키워드 | 
| real | 실수 | 실수 | 
| double precision | 실수 | double | 
| smallserial | long | bigint | 
| serial | long | 정수 | 
| bigserial | long | long | 
| money | 객체 | 객체 | 
| character varying(n) | 텍스트 | 텍스트 | 
| varchar(n) | 텍스트 | 텍스트 | 
| character(n) | 텍스트 | 텍스트 | 
| char(n) | 텍스트 | 텍스트 | 
| bpchar(n) | 텍스트 | 텍스트 | 
| bpchar | 텍스트 | 텍스트 | 
| 텍스트 | 텍스트 | 텍스트 | 
| enum | 텍스트 | 텍스트 | 
| bytea | 텍스트 | 이진수 | 
| timestamp [ (p) ](시간대 제외) | long(에포크 밀리초) | 날짜 | 
| timestamp [ (p) ](시간대 포함) | long(에포크 밀리초) | 날짜 | 
| 날짜 | long(에포크 밀리초) | 날짜 | 
| time [ (p) ](시간대 제외) | long(에포크 밀리초) | 날짜 | 
| time [ (p) ](시간대 포함) | long(에포크 밀리초) | 날짜 | 
| interval [ fields ] [ (p) ] | text(ISO8601 형식) | 텍스트 | 
| 부울 | 부울 | 부울 | 
| point | text(WKT 형식) | geo\$1shape | 
| line | text(WKT 형식) | geo\$1shape | 
| lseg | text(WKT 형식) | geo\$1shape | 
| box | text(WKT 형식) | geo\$1shape | 
| 경로 | text(WKT 형식) | geo\$1shape | 
| 다각형 | text(WKT 형식) | geo\$1shape | 
| circle | 객체 | 객체 | 
| cidr | 텍스트 | 텍스트 | 
| inet | 텍스트 | 텍스트 | 
| macaddr | 텍스트 | 텍스트 | 
| macaddr8 | 텍스트 | 텍스트 | 
| bit(n) | long | byte, short, integer 또는 long(비트 수에 따라 다름) | 
| bit varying(n) | long | byte, short, integer 또는 long(비트 수에 따라 다름) | 
| json | 객체 | 객체 | 
| jsonb | 객체 | 객체 | 
| jsonpath | 텍스트 | 텍스트 | 

OpenSearch Ingestion 파이프라인에서 DLQ(Dead Letter Queue)를 구성하는 것이 좋습니다. 이 대기열을 구성하면 OpenSearch Service에서는 동적 매핑 실패로 인해 수집할 수 없는 모든 실패한 문서를 대기열로 전송합니다.

자동 매핑이 실패할 경우 파이프라인 구성에서 `template_type` 및 `template_content`를 사용하여 명시적 매핑 규칙을 정의할 수 있습니다. 또는 파이프라인을 시작하기 전에 검색 도메인이나 컬렉션에서 직접 매핑 템플릿을 생성할 수도 있습니다.

## 제한 사항
<a name="rds-PostgreSQL-pipeline-limitations"></a>

RDS for PostgreSQL용 OpenSearch Ingestion 파이프라인을 설정하는 경우 다음과 같은 제한 사항을 고려하세요.
+ 이 통합에서는 파이프라인당 하나의 PostgreSQL 데이터베이스만 지원합니다.
+ 이 통합에서는 현재 교차 리전 데이터 수집을 지원하지 않습니다. Amazon RDS 인스턴스와 OpenSearch 도메인은 동일한 AWS 리전에 있어야 합니다.
+ 이 통합에서는 현재 교차 계정 데이터 수집을 지원하지 않습니다. Amazon RDS 인스턴스와 OpenSearch Ingestion 파이프라인은 동일한 AWS 계정에 있어야 합니다.
+ 지원되는 유일한 인증 메커니즘 AWS Secrets Manager인를 사용하여 Amazon RDS 인스턴스에 인증이 활성화되어 있는지 확인합니다.
+ 기존 파이프라인 구성은 다른 데이터베이스 및/또는 다른 테이블에서 데이터를 수집하도록 업데이트할 수 없습니다. 파이프라인의 데이터베이스 및/또는 테이블 이름을 업데이트하려면 파이프라인을 중지하고 업데이트된 구성으로 다시 시작하거나 새 파이프라인을 생성해야 합니다.
+ 데이터 정의 언어(DDL) 문은 일반적으로 지원되지 않습니다. 다음의 경우에는 데이터 일관성이 유지되지 않습니다.
  + 기본 키가 변경될 경우(추가/삭제/이름 변경)
  + 테이블이 삭제되거나 잘린 경우.
  + 열 이름 또는 데이터 형식이 변경된 경우.
+ 동기화할 PostgreSQL 테이블에 기본 키가 정의되지 않은 경우 데이터 일관성이 보장되지 않습니다. 업데이트/삭제를 OpenSearch에 동기화하려면 OpenSearch 및 싱크 구성에서 사용자 지정 `document_id` 옵션을 올바르게 정의해야 합니다.
+ RDS 다중 AZ DB 클러스터는 지원되지 않습니다.
+ 지원되는 버전: PostgreSQL 16 이상

## 권장되는 CloudWatch 경보
<a name="aurora-mysql-pipeline-metrics"></a>

수집 파이프라인의 성능을 모니터링하려면 다음 CloudWatch 지표가 권장됩니다. 이러한 지표는 내보내기에서 처리된 데이터의 양, 스트림에서 처리된 이벤트의 수, 내보내기 및 스트림 이벤트 처리 오류, 대상에 쓴 문서 수를 식별하는 데 도움이 될 수 있습니다. 이러한 지표 중 하나가 지정된 시간 동안 지정된 값을 초과하면 작업을 수행하도록 CloudWatch 경보를 설정할 수 있습니다.


| 지표 | 설명 | 
| --- | --- | 
| pipeline-name.rds.credentialsChanged | 이 지표는 AWS 보안 암호 교체 빈도를 나타냅니다. | 
| pipeline-name.rds.executorRefreshErrors | 이 지표는 AWS 보안 암호 새로 고침 실패를 나타냅니다. | 
| pipeline-name.rds.exportRecordsTotal | 이 지표는 Amazon Aurora에서 내보낸 레코드 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 레코드 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordProcessingErrors | 이 지표는 Amazon Aurora 클러스터에서 데이터를 읽는 동안 OpenSearch Ingestion 파이프라인에서 처리한 오류 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsSuccessTotal | 이 지표는 성공적으로 처리한 내보내기 레코드의 총 수를 나타냅니다. | 
| pipeline-name.rds.exportRecordsFailedTotal | 이 지표는 처리하지 못한 내보내기 레코드의 총 수를 나타냅니다. | 
| pipeline-name.rds.bytesReceived | 이 지표는 OpenSearch Ingestion 파이프라인에서 수신한 총 바이트 수를 나타냅니다. | 
| pipeline-name.rds.bytesProcessed | 이 지표는 OpenSearch Ingestion 파이프라인에서 처리한 총 바이트 수를 나타냅니다. | 
| pipeline-name.rds.streamRecordsSuccessTotal | 이 지표는 스트림에서 성공적으로 처리한 레코드 수를 나타냅니다. | 
| pipeline-name.rds.streamRecordsFailedTotal | 이 지표는 스트림에서 처리하지 못한 총 레코드 수를 나타냅니다. | 

# Amazon S3와 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-s3"></a>

OpenSearch Ingestion 기능을 사용하면 Amazon S3를 원본 또는 대상으로 사용할 수 있습니다. Amazon S3를 소스로 사용하는 경우 OpenSearch Ingestion 파이프라인으로 데이터를 전송합니다. Amazon S3를 대상으로 사용하는 경우 OpenSearch Ingestion 파이프라인의 데이터를 하나 이상의 S3 버킷에 기록합니다.

**Topics**
+ [소스로서의 Amazon S3](#s3-source)
+ [대상으로서의 Amazon S3](#s3-destination)
+ [소스 역할을 하는 Amazon S3 교차 계정](#fdsf)

## 소스로서의 Amazon S3
<a name="s3-source"></a>

Amazon S3를 데이터 처리 원본으로 사용할 수 있는 두 가지 방법, 즉 *S3-SQS 처리*와 *예약 스캔*이 있습니다.

S3에 파일을 기록한 후 파일을 거의 실시간으로 스캔해야 하는 경우 S3-SQS 처리를 사용하세요. 객체가 버킷 내에 저장되거나 수정될 때마다 이벤트를 발생시키도록 Amazon S3 버킷을 구성할 수 있습니다. 일회성 또는 반복되는 예약 스캔을 사용하여 S3 버킷의 데이터를 일괄 처리하세요.

**Topics**
+ [사전 조건](#s3-prereqs)
+ [1단계: 파이프라인 역할 구성](#s3-pipeline-role)
+ [2단계: 파이프라인 생성](#s3-pipeline)

### 사전 조건
<a name="s3-prereqs"></a>

예약 스캔 또는 S3-SQS 처리 모두에 대해 Amazon S3를 OpenSearch Ingestion 파이프라인의 소스로 사용하려면 먼저 [S3 버킷을 생성](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)하세요.

**참고**  
OpenSearch Ingestion 파이프라인에서 소스로 사용되는 S3 버킷이 다른에 AWS 계정있는 경우 버킷에 대한 교차 계정 읽기 권한도 활성화해야 합니다. 이렇게 하면 파이프라인이 데이터를 읽고 처리할 수 있습니다. 교차 계정 권한을 활성화하려면 *Amazon S3 사용 설명서*의 [계정 간 버킷 권한 부여하는 버킷 소유자](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)를 참조하세요.  
S3 버킷이 여러 계정에 있는 경우 `bucket_owners` 맵을 사용합니다. 예제는 OpenSearch 설명서의 [Cross-account S3 access](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/s3/#cross-account-s3-access)를 참조하세요.

S3-SQS 처리를 설정하려면 다음 단계도 수행해야 합니다.

1. [Amazon SQS 대기열을 생성합니다](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/step-create-queue.html).

1. SQS 대기열을 대상으로 하는 S3 버킷에서 [이벤트 알림을 활성화](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-event-notifications.html)합니다.

### 1단계: 파이프라인 역할 구성
<a name="s3-pipeline-role"></a>

데이터를 파이프라인으로 *푸시*하는 다른 소스 플러그인과 달리 [S3 소스 플러그인](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/s3/)은 파이프라인이 소스에서 데이터를 *가져오는* 읽기 기반 아키텍처를 사용합니다.

따라서 S3에서 파이프라인을 읽으려면 S3 버킷과 Amazon SQS 대기열 모두에 액세스할 수 있는 파이프라인의 S3 소스 구성 내에서 역할을 지정해야 합니다. 파이프라인은 대기열에서 데이터를 읽기 위해 이 역할을 맡습니다.

**참고**  
S3 소스 구성 내에서 지정하는 역할은 [파이프라인 역할]()이어야 합니다. 따라서 파이프라인 역할에는 두 개의 개별 권한 정책이 포함되어야 합니다. 하나는 싱크에 쓰는 정책이고 다른 하나는 S3 소스에서 가져오기 위한 것입니다. 모든 파이프라인 구성 요소에서 `sts_role_arn`을 동일하게 사용해야 합니다.

다음 샘플 정책은 S3를 소스로 사용하는 데 필요한 권한을 보여줍니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action":[
          "s3:ListBucket",
          "s3:GetBucketLocation",
          "s3:GetObject"
       ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
    },
    {
       "Effect":"Allow",
       "Action":"s3:ListAllMyBuckets",
       "Resource":"arn:aws:s3:::*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "sqs:DeleteMessage",
        "sqs:ReceiveMessage",
        "sqs:ChangeMessageVisibility"
      ],
      "Resource": "arn:aws:sqs:us-east-1:111122223333:MyS3EventSqsQueue"
    }
  ]
}
```

------

 S3 소스 플러그인 구성 내 `sts_role_arn` 옵션에 지정하는 IAM 역할에 다음 권한을 연결해야 합니다.

```
version: "2"
source:
  s3:
    ...
    aws:
      ...
processor:
  ...
sink:
  - opensearch:
      ...
```

### 2단계: 파이프라인 생성
<a name="s3-pipeline"></a>

권한을 설정한 후 Amazon S3 사용 사례에 따라 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

#### S3-SQS 처리
<a name="s3-sqs-processing"></a>

S3-SQS 처리를 설정하려면 S3를 소스로 지정하도록 파이프라인을 구성하고 Amazon SQS 알림을 설정하세요.

```
version: "2"
s3-pipeline:
  source:
    s3:
      notification_type: "sqs"
      codec:
        newline: null
      sqs:
        queue_url: "https://sqs.us-east-1amazonaws.com/account-id/ingestion-queue"
      compression: "none"
      aws:
        region: "region"
  processor:
  - grok:
      match:
        message:
        - "%{COMMONAPACHELOG}"
  - date:
      destination: "@timestamp"
      from_time_received: true
  sink:
  - opensearch:
      hosts: ["https://search-domain-endpoint.us-east-1es.amazonaws.com"]
      index: "index-name"
      aws:
        region: "region"
```

Amazon S3에서 작은 파일을 처리하는 동안 CPU 사용률이 낮게 나타나면 `workers` 옵션 값을 수정하여 처리량을 늘리는 방법을 고려합니다. 자세한 내용은 [S3 plugin configuration options](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/s3/#configuration)를 참조하세요.

#### 예약 스캔
<a name="s3-scheduled-scan"></a>

예약 스캔을 설정하려면 모든 S3 버킷에 적용되는 스캔 수준 또는 버킷 수준의 일정으로 파이프라인을 구성하세요. 버킷 수준 일정 또는 스캔 간격 구성은 항상 스캔 수준 구성을 덮어씁니다.

예약 스캔은 데이터 마이그레이션에 적합한 *1회성 스캔* 또는 일괄 처리에 적합한 *반복 스캔*으로 구성할 수 있습니다.

Amazon S3에서 읽을 파이프라인을 구성하려면 사전 구성된 Amazon S3 블루프린트를 사용합니다. 일정 요구 사항에 맞게 파이프라인 구성의 `scan` 일부를 편집할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

**1회성 스캔**

1회성 예약 스캔은 한 번 실행됩니다. 파이프라인 구성에서 `start_time` 및 `end_time`을 사용하여 버킷의 객체를 스캔할 시기를 지정할 수 있습니다. 또는 버킷의 객체를 스캔하려는 현재 시간을 기준으로 시간 간격을 지정하는 데 `range`을 사용할 수 있습니다.

예를 들어 최근 4시간 동안 생성된 모든 파일을 `PT4H` 스캔하도록 범위를 설정합니다. 한 번 스캔을 두 번 실행하도록 구성하려면 파이프라인을 중지하고 다시 시작해야 합니다. 범위를 구성하지 않은 경우 시작 시간 및 종료 시간도 업데이트해야 합니다.

다음 구성은 모든 버킷과 해당 버킷의 모든 객체를 한 번 스캔하도록 설정합니다.

```
version: "2"
log-pipeline:
  source:
    s3:
      codec:
        csv:
      compression: "none"
      aws:
        region: "region"
      acknowledgments: true
      scan:
        buckets:
          - bucket:
              name: my-bucket
              filter:
                include_prefix:
                  - Objects1/
                exclude_suffix:
                  - .jpeg
                  - .png
          - bucket:
              name: my-bucket-2
              key_prefix:
                include:
                  - Objects2/
                exclude_suffix:
                  - .jpeg
                  - .png
      delete_s3_objects_on_read: false
  processor:
    - date:
        destination: "@timestamp"
        from_time_received: true
  sink:
    - opensearch:
        hosts: ["https://search-domain-endpoint.us-east-1es.amazonaws.com"]
        index: "index-name"
        aws:
          region: "region"
        dlq:
          s3:
            bucket: "dlq-bucket"
            region: "us-east-1"
```

다음 구성은 지정된 기간 동안 모든 버킷에 대한 1회성 스캔을 설정합니다. 즉, S3는 생성 시간이 이 기간에 해당하는 객체만 처리합니다.

```
scan:
  start_time: 2023-01-21T18:00:00.000Z
  end_time: 2023-04-21T18:00:00.000Z
  buckets:
    - bucket:
        name: my-bucket-1
        filter:
          include:
            - Objects1/
          exclude_suffix:
            - .jpeg
            - .png
    - bucket:
        name: my-bucket-2
        filter:
          include:
            - Objects2/
          exclude_suffix:
            - .jpeg
            - .png
```

다음 구성은 스캔 수준과 버킷 수준 모두에서 1회성 스캔을 설정합니다. 버킷 수준의 시작 및 종료 시간은 스캔 수준의 시작 및 종료 시간보다 우선합니다.

```
scan:
  start_time: 2023-01-21T18:00:00.000Z
  end_time: 2023-04-21T18:00:00.000Z
  buckets:
    - bucket:
        start_time: 2023-01-21T18:00:00.000Z
        end_time: 2023-04-21T18:00:00.000Z
        name: my-bucket-1
        filter:
          include:
            - Objects1/
          exclude_suffix:
            - .jpeg
            - .png
    - bucket:
        start_time: 2023-01-21T18:00:00.000Z
        end_time: 2023-04-21T18:00:00.000Z
        name: my-bucket-2
        filter:
          include:
            - Objects2/
          exclude_suffix:
            - .jpeg
            - .png
```

파이프라인을 중지하면 중지 전에 파이프라인에서 스캔한 객체에 대한 기존 참조가 제거됩니다. 단일 스캔 파이프라인이 중지되면 이미 스캔되었어도 시작된 이후 모든 객체를 다시 스캔합니다. 단일 스캔 파이프라인을 중지해야 하는 경우 파이프라인을 다시 시작하기 전에 기간을 변경하는 것이 좋습니다.

시작 시간 및 종료 시간별로 객체를 필터링해야 하는 경우 파이프라인을 중지하고 시작하는 것이 유일한 옵션입니다. 시작 시간 및 종료 시간을 기준으로 필터링할 필요가 없는 경우 이름을 기준으로 객체를 필터링할 수 있습니다. 이름을 기준으로 필터링하는 경우 파이프라인을 중지하고 시작할 필요가 없습니다. 이렇게 하려면 `include_prefix` 및 `exclude_suffix`를 사용합니다.

**반복 스캔**

반복 예약 스캔은 지정된 S3 버킷의 스캔을 정기적으로 예약된 간격으로 실행합니다. 개별 버킷 수준 구성은 지원되지 않으므로 스캔 수준에서만 이러한 간격을 구성할 수 있습니다.

파이프라인 구성에서는 `interval`이 반복 스캔 빈도를 지정하며 30초에서 365일 사이일 수 있습니다. 파이프라인을 생성할 때 항상 첫 번째 스캔이 발생합니다. `count`는 스캔 인스턴스 총 수를 정의합니다.

다음 구성은 스캔 사이에 12시간의 지연을 두고 반복 스캔을 설정합니다.

```
scan:
  scheduling:
    interval: PT12H
    count: 4
  buckets:
    - bucket:
        name: my-bucket-1
        filter:
          include:
            - Objects1/
          exclude_suffix:
            - .jpeg
            - .png
    - bucket:
        name: my-bucket-2
        filter:
          include:
            - Objects2/
          exclude_suffix:
            - .jpeg
            - .png
```

## 대상으로서의 Amazon S3
<a name="s3-destination"></a>

OpenSearch Ingestion 파이프라인의 데이터를 S3 버킷에 쓰려면 사전 구성된 S3 블루프린트를 사용하여 [S3 싱크](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sinks/s3/)가 있는 파이프라인을 생성합니다. 이 파이프라인은 선택적 데이터를 OpenSearch 싱크로 라우팅하고 동시에 S3에 보관할 모든 데이터를 전송합니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

S3 싱크를 생성할 때 다양한 [싱크 코덱](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sinks/s3/#codec) 중에서 원하는 형식을 지정할 수 있습니다. 예를 들어 데이터를 열 형식으로 쓰려면 Parquet 또는 Avro 코덱을 선택하세요. 행 기반 형식을 선호하는 경우 JSON 또는 NDJSON을 선택하세요. 지정된 스키마로 S3에 데이터를 쓰려면 [Avro 형식](https://avro.apache.org/docs/current/specification/#schema-declaration)을 사용하여 싱크 코덱 내에 인라인 스키마를 정의할 수도 있습니다.

다음 예제에서는 S3 싱크에 인라인 스키마를 정의합니다.

```
- s3:
  codec:
    parquet:
      schema: >
        {
           "type" : "record",
           "namespace" : "org.vpcFlowLog.examples",
           "name" : "VpcFlowLog",
           "fields" : [
             { "name" : "version", "type" : "string"},
             { "name" : "srcport", "type": "int"},
             { "name" : "dstport", "type": "int"},
             { "name" : "start", "type": "int"},
             { "name" : "end", "type": "int"},
             { "name" : "protocol", "type": "int"},
             { "name" : "packets", "type": "int"},
             { "name" : "bytes", "type": "int"},
             { "name" : "action", "type": "string"},
             { "name" : "logStatus", "type" : "string"}
           ]
         }
```

이 스키마를 정의할 때는 파이프라인이 싱크에 전달하는 다양한 유형의 이벤트에 존재할 수 있는 모든 키의 상위 세트를 지정하세요.

예를 들어 이벤트에 키가 누락될 가능성이 있는 경우 스키마에 해당 키를 `null` 값과 함께 추가하세요. Null 값 선언을 사용하면 스키마가 비균일 데이터를 처리할 수 있습니다(일부 이벤트에는 이러한 키가 있고 다른 이벤트에는 이러한 키가 없는 경우). 수신 이벤트에 이러한 키가 있는 경우 해당 값이 싱크에 기록됩니다.

이 스키마 정의는 정의된 키만 싱크로 전송하도록 허용하고 수신 이벤트에서 정의되지 않은 키를 삭제하는 필터 역할을 합니다.

싱크에서 `include_keys` 및 `exclude_keys`를 사용하여 다른 싱크로 라우팅되는 데이터를 필터링할 수도 있습니다. 이 두 필터는 상호 배타적이므로 스키마에서 한 번에 하나만 사용할 수 있습니다. 또한 사용자 정의 스키마 내에서는 이러한 스키마를 사용할 수 없습니다.

이러한 필터를 사용하여 파이프라인을 생성하려면 사전 구성된 싱크 필터 블루프린트를 사용합니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

## 소스 역할을 하는 Amazon S3 교차 계정
<a name="fdsf"></a>

OpenSearch Ingestion 파이프라인이 다른 계정의 S3 버킷에 소스로 액세스할 수 있도록 Amazon S3가 있는 여러 계정에서 액세스 권한을 부여할 수 있습니다. 교차 계정 액세스를 활성화하려면 **Amazon S3 사용 설명서의 [교차 계정 버킷 권한을 부여하는 버킷 소유자](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)를 참조하세요. 액세스 권한을 부여한 후 파이프라인 역할에 필요한 권한이 있는지 확인합니다.

그런 다음, `bucket_owners`를 사용하여 파이프라인을 생성해 소스로 Amazon S3 버킷에 대한 교차 계정 액세스를 활성화할 수 있습니다.

```
s3-pipeline:
 source:
  s3:
   notification_type: "sqs"
   codec:
    csv:
     delimiter: ","
     quote_character: "\""
     detect_header: True
   sqs:
    queue_url: "https://sqs.ap-northeast-1.amazonaws.com/401447383613/test-s3-queue"
   bucket_owners:
    my-bucket-01: 123456789012
    my-bucket-02: 999999999999
   compression: "gzip"
```

# Amazon Security Lake와 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-security-lake"></a>

[S3 소스 플러그인](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/s3/)을 사용하여 [Amazon Security Lake](https://docs.aws.amazon.com/security-lake/latest/userguide/what-is-security-lake.html)의 데이터를 OpenSearch Ingestion 파이프라인으로 수집할 수 있습니다. Security Lake는 AWS 환경, 온프레미스 환경 및 SaaS 공급자의 보안 데이터를 특별히 구축된 데이터 레이크로 자동으로 중앙 집중화합니다. Security Lake의 데이터를 OpenSearch Ingestion 파이프라인으로 복제하는 구독을 생성하여 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션에 데이터를 쓸 수 있습니다.

Security Lake에서 읽을 파이프라인을 구성하려면 사전 구성된 Security Lake 블루프린트를 사용합니다. 청사진에는 Security Lake에서 Open Cybersecurity Schema Framewor(OCSF) 파켓 파일을 수집하기 위한 기본 구성이 포함되어 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

**Topics**
+ [소스로서의 Amazon Security Lake와 함께 OpenSearch Ingestion 파이프라인 사용](configure-client-source-security-lake.md)
+ [싱크로서의 Amazon Security Lake와 함께 OpenSearch Ingestion 파이프라인 사용](configure-client-sink-security-lake.md)

# 소스로서의 Amazon Security Lake와 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-source-security-lake"></a>

OpenSearch Ingestion 파이프라인 내에서 Amazon S3 소스 플러그인을 사용하여 Amazon Security Lake의 데이터를 수집할 수 있습니다. Security Lake는 AWS 환경, 온프레미스 시스템 및 SaaS 제공업체의 보안 데이터를 특별히 구축된 데이터 레이크로 자동 중앙 집중화합니다.

Amazon Security Lake에는 파이프라인 내에 다음 메타데이터 속성이 있습니다.
+ `bucket_name`: 보안 데이터를 저장하기 위해 Security Lake가 생성한 Amazon S3 버킷의 이름입니다.
+ `path_prefix`: Security Lake IAM 역할 정책에 정의된 사용자 지정 소스 이름입니다.
+ `region`: Security Lake S3 버킷이 AWS 리전 위치한 입니다.
+ `accountID`: Security Lake가 활성화된 AWS 계정 ID입니다.
+ `sts_role_arn`: Security Lake와 함께 사용하기 위한 IAM 역할의 ARN입니다.

## 사전 조건
<a name="sl-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.
+ [Security Lake를 활성화합니다](https://docs.aws.amazon.com/security-lake/latest/userguide/getting-started.html#enable-service).
+ Security Lake에서 [구독자를 생성](https://docs.aws.amazon.com/security-lake/latest/userguide/subscriber-data-access.html#create-subscriber-data-access)하세요.
  + 파이프라인에 수집하려는 소스를 선택하세요.
  + **구독자 자격 증명**에 파이프라인을 생성하려는 AWS 계정 의 ID를 추가합니다. 외부 ID의 경우 `OpenSearchIngestion-{accountid}`을 지정하세요.
  + **데이터 액세스 메서드**로는 **S3**를 선택합니다.
  + **알림 세부 정보**를 보려면 **SQS 대기열**을 선택합니다.

구독자를 생성하면 Security Lake는 자동으로 두 개의 인라인 권한 정책을 생성합니다. 하나는 S3용이고 다른 하나는 SQS용입니다. 정책 형식은 `AmazonSecurityLake-amzn-s3-demo-bucket-S3` 및 `AmazonSecurityLake-AWS Demo-SQS`입니다. 파이프라인이 구독자 소스에 액세스할 수 있게 하려면 필요한 권한을 파이프라인 역할에 연결해야 합니다.

## 파이프라인 역할 구성
<a name="sl-pipeline-role"></a>

Security Lake에서 자동으로 생성한 두 정책의 필수 권한만 결합하는 새 권한 정책을 IAM에 생성하세요. 다음 예제 정책은 OpenSearch Ingestion 파이프라인이 여러 Security Lake 소스의 데이터를 읽는 데 필요한 최소 권한을 보여줍니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObject"
         ],
         "Resource":[
            "arn:aws:s3:::aws-security-data-lake-us-east-1-abcde/aws/LAMBDA_EXECUTION/1.0/*",
            "arn:aws:s3:::aws-security-data-lake-us-east-1-abcde/aws/S3_DATA/1.0/*",
            "arn:aws:s3:::aws-security-data-lake-us-east-1-abcde/aws/VPC_FLOW/1.0/*",
            "arn:aws:s3:::aws-security-data-lake-us-east-1-abcde/aws/ROUTE53/1.0/*",
            "arn:aws:s3:::aws-security-data-lake-us-east-1-abcde/aws/SH_FINDINGS/1.0/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "sqs:ReceiveMessage",
            "sqs:DeleteMessage"
         ],
         "Resource":[
            "arn:aws:sqs:us-east-1:111122223333:AmazonSecurityLake-abcde-Main-Queue"
         ]
      }
   ]
}
```

------

**중요**  
Security Lake는 파이프라인 역할 정책을 대신 관리하지 않습니다. Security Lake 구독에서 소스를 추가하거나 제거하는 경우 정책을 수동으로 업데이트해야 합니다. Security Lake는 각 로그 소스에 대해 파티션을 생성하므로 파이프라인 역할에서 권한을 수동으로 추가하거나 제거해야 합니다.

`sqs`에서 S3 소스 플러그인 구성 내 `sts_role_arn` 옵션에 지정하는 IAM 역할에 다음 권한을 연결해야 합니다.

```
version: "2"
source:
  s3:
    ...
    sqs:
      queue_url: "https://sqs.us-east-1amazonaws.com/account-id/AmazonSecurityLake-amzn-s3-demo-bucket-Main-Queue"
    aws:
      ...
processor:
  ...
sink:
  - opensearch:
      ...
```

## 파이프라인 생성
<a name="sl-pipeline"></a>

파이프라인 역할에 권한을 추가한 후 사전 구성된 Security Lake 블루프린트를 사용하여 파이프라인을 생성합니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

`s3` 소스 구성 내에서 읽을 Amazon SQS 대기열 URL인 `queue_url` 옵션을 지정해야 합니다. URL 형식을 지정하려면 구독자 구성에서 **구독 엔드포인트**를 찾아 `arn:aws:`를 `https://`로 변경하세요. 예를 들어 `https://sqs.us-east-1amazonaws.com/account-id/AmazonSecurityLake-AWS Demo-Main-Queue`입니다.

S3 소스 구성 내에서 지정하는 `sts_role_arn`은 파이프라인 역할의 ARN이어야 합니다.

# 싱크로서의 Amazon Security Lake와 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-sink-security-lake"></a>

OpenSearch Ingestion의 Amazon S3 싱크 플러그인을 사용하여 지원되는 소스에서 Amazon Security Lake로 데이터를 전송합니다. Security Lake는, AWS온프레미스 환경 및 SaaS 공급자로부터 보안 데이터를 수집하여 전용 데이터 레이크에 저장합니다.

Security Lake에 로그 데이터를 쓰도록 파이프라인을 구성하려면 사전 구성된 **방화벽 트래픽 로그** 블루프린트를 사용합니다. 이 블루프린트에는 Amazon S3 버킷에 저장된 원시 보안 로그 또는 기타 데이터를 검색하고, 레코드를 처리하고, 정규화하기 위한 기본 구성이 포함되어 있습니다. 그런 다음 Open Cybersecurity Schema Framework(OCSF)에 데이터를 매핑하고 변환된 OCSF 준수 데이터를 Security Lake로 전송합니다.

파이프라인에는 다음 메타데이터 속성이 있습니다.
+ `bucket_name`: 보안 데이터를 저장하기 위해 Security Lake가 생성한 Amazon S3 버킷의 이름입니다.
+ `path_prefix`: Security Lake IAM 역할 정책에 정의된 사용자 지정 소스 이름입니다.
+ `region`: Security Lake S3 버킷이 AWS 리전 위치한 입니다.
+ `accountID`: Security Lake가 활성화된 AWS 계정 ID입니다.
+ `sts_role_arn`: Security Lake와 함께 사용하기 위한 IAM 역할의 ARN입니다.

## 사전 조건
<a name="configure-clients-lambda-prereqs"></a>

Security Lake로 데이터를 전송하는 파이프라인을 생성하기 전에 다음 단계를 수행합니다.
+ **Amazon Security Lake 활성화 및 구성**: 다양한 소스의 보안 데이터를 중앙 집중화하도록 Amazon Security Lake를 설정합니다. 지침은 [콘솔을 사용하여 Security Lake 활성화](https://docs.aws.amazon.com/security-lake/latest/userguide/get-started-console.html)를 참조하세요.

  소스를 선택할 때 **특정 AWS 소스 수집**을 선택하고 수집할 로그 및 이벤트 소스를 하나 이상 선택합니다.
+ **권한 설정**: Security Lake에 데이터를 쓰는 데 필요한 권한으로 파이프라인 역할을 구성합니다. 자세한 내용은 [파이프라인 역할](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-sink)을 참조하세요.

### 파이프라인 생성
<a name="create-opensearch-ingestion-pipeline"></a>

사전 구성된 Security Lake 블루프린트를 사용하여 파이프라인을 생성합니다. 자세한 내용은 [블루프린트를 사용하여 파이프라인 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-blueprint.html)을 참조하세요.

# Fluent Bit와 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-fluentbit"></a>

이 샘플 [Fluent Bit 구성 파일](https://docs.fluentbit.io/manual/pipeline/outputs/http)은 Fluent Bit의 로그 데이터를 OpenSearch Ingestion 파이프라인으로 보냅니다. 로그 데이터 수집에 대한 자세한 내용은 Data Prepper 설명서의 [로그 분석](https://github.com/opensearch-project/data-prepper/blob/main/docs/log_analytics.md)을 참조하세요.

다음 사항에 유의하세요.
+ `host` 값은 파이프라인 엔드포인트여야 합니다. 예를 들어 `pipeline-endpoint.us-east-1osis.amazonaws.com`입니다.
+ `aws_service` 값은 `osis`여야 합니다.
+ `aws_role_arn` 값은 클라이언트가 서명 버전 4 인증에 수임하고 사용할 AWS IAM 역할의 ARN입니다.

```
[INPUT]
  name                  tail
  refresh_interval      5
  path                  /var/log/test.log
  read_from_head        true

[OUTPUT]
  Name http
  Match *
  Host pipeline-endpoint.us-east-1osis.amazonaws.com
  Port 443
  URI /log/ingest
  Format json
  aws_auth true
  aws_region region
  aws_service osis
  aws_role_arn arn:aws:iam::account-id:role/ingestion-role
  Log_Level trace
  tls On
```

그런 다음 HTTP를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

```
version: "2"
unaggregated-log-pipeline:
  source:
    http:
      path: "/log/ingest"
  processor:
    - grok:
        match:
          log:
            - "%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:network_node} %{NOTSPACE:network_host} %{IPORHOST:source_ip}:%{NUMBER:source_port:int} -> %{IPORHOST:destination_ip}:%{NUMBER:destination_port:int} %{GREEDYDATA:details}"
    - grok:
        match:
          details:
            - "'%{NOTSPACE:http_method} %{NOTSPACE:http_uri}' %{NOTSPACE:protocol}"
            - "TLS%{NOTSPACE:tls_version} %{GREEDYDATA:encryption}"
            - "%{NUMBER:status_code:int} %{NUMBER:response_size:int}"
    - delete_entries:
        with_keys: ["details", "log"]

  sink:
    - opensearch:
        hosts: ["https://search-domain-endpoint.us-east-1es.amazonaws.com"]
        index: "index_name"
        index_type: custom
        bulk_size: 20
        aws:
          region: "region"
```

# Fluent Bit에서 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-fluentd"></a>

Fluentd는 Fluent Bit와 같은 다양한 언어 및 하위 프로젝트용 SDK를 제공하는 오픈 소스 데이터 컬렉션 에코시스템입니다. 이 샘플 [Fluentd 구성 파일](https://docs.fluentd.org/output/http#example-configuration)은 Fluentd의 로그 데이터를 OpenSearch Ingestion 파이프라인으로 전송합니다. 로그 데이터 수집에 대한 자세한 내용은 Data Prepper 설명서의 [로그 분석](https://github.com/opensearch-project/data-prepper/blob/main/docs/log_analytics.md)을 참조하세요.

다음 사항에 유의하세요.
+ `endpoint` 값은 파이프라인 엔드포인트여야 합니다. 예를 들어 `pipeline-endpoint.us-east-1osis.amazonaws.com/apache-log-pipeline/logs`입니다.
+ `aws_service` 값은 `osis`여야 합니다.
+ `aws_role_arn` 값은 클라이언트가 서명 버전 4 인증에 수임하고 사용할 AWS IAM 역할의 ARN입니다.

```
<source>
  @type tail
  path logs/sample.log
  path_key log
  tag apache
  <parse>
    @type none
  </parse>
</source>

<filter apache>
  @type record_transformer
  <record>
    log ${record["message"]}
  </record>
</filter>

<filter apache>
  @type record_transformer
  remove_keys message
</filter>

<match apache>
  @type http
  endpoint pipeline-endpoint.us-east-1osis.amazonaws.com/apache-log-pipeline/logs
  json_array true

  <auth>
    method aws_sigv4
    aws_service osis
    aws_region region
    aws_role_arn arn:aws:iam::account-id:role/ingestion-role
  </auth>

  <format>
    @type json
  </format>

  <buffer>
    flush_interval 1s
  </buffer>
</match>
```

그런 다음 HTTP를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

```
version: "2"
apache-log-pipeline:
  source:
    http:
      path: "/${pipelineName}/logs"
  processor:
    - grok:
        match:
          log:
            - "%{TIMESTAMP_ISO8601:timestamp} %{NOTSPACE:network_node} %{NOTSPACE:network_host} %{IPORHOST:source_ip}:%{NUMBER:source_port:int} -> %{IPORHOST:destination_ip}:%{NUMBER:destination_port:int} %{GREEDYDATA:details}"
  sink:
    - opensearch:
        hosts: ["https://search-domain-endpoint.us-east-1es.amazonaws.com"]
        index: "index_name"
        aws_region: "region"
        aws_sigv4: true
```

# 기계 학습 오프라인 배치 추론과 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-clients-ml-commons-batch"></a>

Amazon OpenSearch Ingestion(OSI) 파이프라인은 낮은 비용으로 대량의 데이터를 효율적으로 보강할 수 있도록 기계 학습(ML) 오프라인 배치 추론 처리를 지원합니다. 비동기적으로 처리할 수 있는 대규모 데이터세트가 있을 때마다 오프라인 배치 추론을 사용합니다. 오프라인 배치 추론은 Amazon Bedrock 및 SageMaker 모델과 함께 작동합니다. 이 기능은 OpenSearch Service 2.17\$1 도메인을 사용하는 OpenSearch Ingestion을 AWS 리전 지원하는 모든에서 사용할 수 있습니다.

**참고**  
실시간 추론 처리의 경우 [서드파티 플랫폼에 대한 Amazon OpenSearch Service ML 커넥터](ml-external-connector.md)를 사용합니다.

오프라인 배치 추론 처리는 ML Commons라는 OpenSearch의 기능을 활용합니다. *ML Commons*는 전송 및 REST API 호출을 통해 ML 알고리즘을 제공합니다. 이러한 직접적 호출은 각 ML 요청에 적합한 노드와 리소스를 선택하고 ML 작업을 모니터링하여 가동 시간을 보장합니다. 이를 통해 ML Commons는 기존 오픈 소스 ML 알고리즘을 활용하고 새로운 ML 기능을 개발하는 데 필요한 노력을 줄일 수 있습니다. ML Commons에 대한 자세한 내용은 OpenSearch.org 설명서의 [Machine learning](https://docs.opensearch.org/latest/ml-commons-plugin/)을 참조하세요.

## 작동 방식
<a name="configure-clients-ml-commons-batch-how"></a>

[기계 학습 추론 프로세서를 파이프라인에 추가](https://docs.opensearch.org/latest/ingest-pipelines/processors/ml-inference/)하여 OpenSearch Ingestion에서 오프라인 배치 추론 파이프라인을 생성할 수 있습니다. 이 프로세서를 사용하면 파이프라인을 SageMaker와 같은 AI 서비스에 연결하여 배치 추론 작업을 실행할 수 있습니다. 대상 도메인에서 실행되는 AI 커넥터([batch\$1predict](https://docs.opensearch.org/latest/ml-commons-plugin/api/model-apis/batch-predict/) 지원 포함)를 통해 원하는 AI 서비스에 연결하도록 프로세서를 구성할 수 있습니다.

OpenSearch Ingestion은 ML Commons와 함께 `ml_inference` 프로세서를 사용하여 오프라인 배치 추론 작업을 생성합니다. 그런 다음 ML Commons는 [batch\$1predict](https://docs.opensearch.org/latest/ml-commons-plugin/api/model-apis/batch-predict/) API를 사용합니다. 이 API는 Amazon Bedrock, Amazon SageMaker, Cohere 및 OpenAI의 외부 모델 서버에 배포된 모델을 사용하여 오프라인 비동기 모드로 대규모 데이터세트에 대한 추론을 수행합니다. 다음 다이어그램은 여러 구성 요소를 오케스트레이션하여 이 프로세스를 처음부터 끝까지 수행하는 OpenSearch Ingestion 파이프라인을 보여줍니다.

![\[배치 AI 추론 처리의 3 파이프라인 아키텍처.\]](http://docs.aws.amazon.com/ko_kr/opensearch-service/latest/developerguide/images/ml_processor.png)


파이프라인 구성 요소는 다음과 같이 작동합니다.

**파이프라인 1(데이터 준비 및 변환)\$1:**
+ 소스: OpenSearch Ingestion에서 지원하는 외부 소스에서 스캔한 데이터.
+ 데이터 프로세서: 원시 데이터는 통합 AI 서비스에서 배치 추론을 위해 처리되고 올바른 형식으로 변환됩니다.
+ S3(싱크): 처리된 데이터는 통합 AI 서비스에서 배치 추론 작업을 실행하기 위한 입력으로 사용할 준비가 된 Amazon S3 버킷에 스테이징됩니다.

**파이프라인 2(트리거 ML batch\$1inference):**
+ 소스: 파이프라인 1의 출력으로 생성된 새 파일의 자동 S3 이벤트 감지.
+ Ml\$1inference 프로세서: 비동기 배치 작업을 통해 ML 추론을 생성하는 프로세서. 대상 도메인에서 실행 중인 구성된 AI 커넥터를 통해 AI 서비스에 연결합니다.
+ 작업 ID: 각 배치 작업은 추적 및 관리를 위해 ml-commons의 작업 ID와 연결됩니다.
+ OpenSearch ML Commons: 실시간 신경망 검색을 위해 모델을 호스팅하고, 원격 AI 서버에 대한 커넥터를 관리하고, 배치 추론 및 작업 관리를 위한 API를 제공하는 ML Commons.
+ AI 서비스: OpenSearch ML Commons는 Amazon Bedrock 및 Amazon SageMaker와 같은 AI 서비스와 상호 작용하여 데이터에 대한 배치 추론을 수행함으로써 예측 또는 인사이트를 생성합니다. 결과는 별도의 S3 파일에 비동기적으로 저장됩니다.

**파이프라인 3(대량 수집):**
+ S3(소스): 배치 작업의 결과는 이 파이프라인의 소스인 S3에 저장됩니다.
+ 데이터 변환 프로세서: 수집 전에 배치 추론 출력에 추가 처리 및 변환이 적용됩니다. 이는 OpenSearch 인덱스에서 데이터가 올바르게 매핑되도록 보장합니다.
+ OpenSearch 인덱스(싱크): 처리된 결과는 스토리지, 검색 및 추가 분석을 위해 OpenSearch에 인덱싱됩니다.

**참고**  
\$1파이프라인 1에서 설명하는 프로세스는 선택 사항입니다. 원하는 경우 해당 프로세스를 건너뛰고 S3 싱크에 준비된 데이터를 업로드하여 배치 작업을 생성할 수도 있습니다.

## ml\$1inference 프로세서 정보
<a name="configure-clients-ml-commons-batch-inference-processor"></a>

OpenSearch Ingestion은 배치 처리를 위해 S3 스캔 소스와 ML 추론 프로세서 간의 특수한 통합을 사용합니다. S3 스캔은 메타데이터 전용 모드에서 작동하여 실제 파일 콘텐츠를 읽지 않고도 S3 파일 정보를 효율적으로 수집합니다. `ml_inference` 프로세서는 S3 파일 URL을 사용하여 배치 처리를 위해 ML Commons와 조율합니다. 이러한 설계는 스캔 단계에서 불필요한 데이터 전송을 최소화하여 배치 추론 워크플로를 최적화합니다. `ml_inference` 프로세서는 사용자가 파라미터를 사용하여 정의합니다. 다음 예를 참고하세요 

```
processor:
    - ml_inference:
        # The endpoint URL of your OpenSearch domain
        host: "https://AWS test-offlinebatch-123456789abcdefg.us-west-2.es.amazonaws.com"
        
        # Type of inference operation:
        # - batch_predict: for batch processing
        # - predict: for real-time inference
        action_type: "batch_predict"
        
        # Remote ML model service provider (Amazon Bedrock or SageMaker)
        service_name: "bedrock"
        
        # Unique identifier for the ML model
        model_id: "AWS TestModelID123456789abcde"
        
        # S3 path where batch inference results will be stored
        output_path: "s3://amzn-s3-demo-bucket/"
      
        # Supports ISO_8601 notation strings like PT20.345S or PT15M
        # These settings control how long to keep your inputs in the processor for retry on throttling errors
        retry_time_window: "PT9M"
        
        # AWS configuration settings
        aws:
            # AWS 리전 where the Lambda function is deployed
            region: "us-west-2"
            # IAM role ARN for Lambda function execution
            sts_role_arn: "arn:aws::iam::account_id:role/Admin"
        
        # Dead-letter queue settings for storing errors
        dlq:
          s3:
            region: us-west-2
            bucket: batch-inference-dlq
            key_path_prefix: bedrock-dlq
            sts_role_arn: arn:aws:iam::account_id:role/OSI-invoke-ml
            
        # Conditional expression that determines when to trigger the processor
        # In this case, only process when bucket matches "amzn-s3-demo-bucket"
        ml_when: /bucket == "amzn-s3-demo-bucket"
```

### ml\$1inference 프로세서를 사용한 수집 성능 개선
<a name="configure-clients-ml-commons-batch-ingestion-performance"></a>

OpenSearch Ingestion `ml_inference` 프로세서는 ML 지원 검색의 데이터 수집 성능을 크게 높입니다. 이 프로세서는 시맨틱 검색, 멀티모달 검색, 문서 보강, 쿼리 이해 등 기계 학습 모델 생성 데이터가 필요한 사용 사례에 적합합니다. 시맨틱 검색에서 이 프로세서는 대용량 고차원 벡터의 생성 및 수집을 10배까지 가속화할 수 있습니다.

이 프로세서의 오프라인 배치 추론 기능은 실시간 모델 호출에 비해 고유한 이점을 제공합니다. 실시간 처리에는 용량 제한이 있는 라이브 모델 서버가 필요하지만 배치 추론은 온디맨드로 컴퓨팅 리소스를 동적으로 확장하고 데이터를 병렬로 처리합니다. 예를 들어 OpenSearch Ingestion 파이프라인이 10억 개의 소스 데이터 요청을 수신하면 ML 배치 추론 입력을 위해 100개의 S3 파일을 생성합니다. 그런 다음 `ml_inference` 프로세서는 100개의 `ml.m4.xlarge` Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 사용하여 SageMaker 배치 작업을 시작하고, 14시간 내에 10억 개의 요청을 벡터화하여 실시간 모드에서는 거의 불가능한 작업을 완료합니다.

## 시맨틱 검색에 대한 데이터 요청을 수집하도록 ml\$1inference 프로세서 구성
<a name="configure-clients-ml-commons-configuring"></a>

다음 절차에서는 텍스트 임베딩 모델을 사용하여 의미 체계 검색을 위한 10억 개의 데이터 요청을 수집하도록 OpenSearch Ingestion `ml_inference` 프로세서를 설정하고 구성하는 프로세스를 안내합니다.

**Topics**
+ [1단계: OpenSearch에서 커넥터 생성 및 모델 등록](#configure-clients-ml-commons-configuring-create-connectors)
+ [2단계: ML 오프라인 배치 추론을 위한 OpenSearch Ingestion 파이프라인 생성](#configure-clients-ml-commons-configuring-pipeline)
+ [3단계: 수집을 위한 데이터 준비](#configure-clients-ml-commons-configuring-data)
+ [4단계: 배치 추론 작업 모니터링](#configure-clients-ml-commons-configuring-monitor)
+ [5단계: 검색 실행](#configure-clients-ml-commons-configuring-semantic-search)

### 1단계: OpenSearch에서 커넥터 생성 및 모델 등록
<a name="configure-clients-ml-commons-configuring-create-connectors"></a>

다음 절차에서는 ML Commons [batch\$1inference\$1sagemaker\$1connector\$1blueprint](https://github.com/opensearch-project/ml-commons/blob/main/docs/remote_inference_blueprints/batch_inference_sagemaker_connector_blueprint.md)를 사용하여 Amazon SageMaker에서 커넥터와 모델을 생성합니다. OpenSearch CloudFormation 통합 템플릿을 사용하려면이 섹션 [(대안 절차) 1단계: CloudFormation 통합 템플릿을 사용하여 커넥터 및 모델 생성](#configure-clients-ml-commons-configuring-create-connectors-alternative)뒷부분의 섹션을 참조하세요.

**OpenSearch에서 커넥터를 생성하고 모델을 등록하려면**

1. 배치 변환을 위해 SageMaker에서 Deep Java Library(DJL) ML 모델을 생성합니다. 다른 DJL 모델을 보려면 GitHub의 [semantic\$1search\$1with\$1CFN\$1template\$1for\$1Sagemaker](https://github.com/opensearch-project/ml-commons/blob/main/docs/tutorials/aws/semantic_search_with_CFN_template_for_Sagemaker.md)를 참조하세요.

   ```
   POST https://api.sagemaker.us-east-1.amazonaws.com/CreateModel
   {
      "ExecutionRoleArn": "arn:aws:iam::123456789012:role/aos_ml_invoke_sagemaker",
      "ModelName": "DJL-Text-Embedding-Model-imageforjsonlines",
      "PrimaryContainer": { 
         "Environment": { 
            "SERVING_LOAD_MODELS" : "djl://ai.djl.huggingface.pytorch/sentence-transformers/all-MiniLM-L6-v2" 
         },
         "Image": "763104351884.dkr.ecr.us-east-1.amazonaws.com/djl-inference:0.29.0-cpu-full"
      }
   }
   ```

1. `actions` 필드에 `batch_predict`를 새 `action` 유형으로 사용하여 커넥터를 생성합니다.

   ```
   POST /_plugins/_ml/connectors/_create
   {
     "name": "DJL Sagemaker Connector: all-MiniLM-L6-v2",
     "version": "1",
     "description": "The connector to sagemaker embedding model all-MiniLM-L6-v2",
     "protocol": "aws_sigv4",
     "credential": {
     "roleArn": "arn:aws:iam::111122223333:role/SageMakerRole"
   },
     "parameters": {
       "region": "us-east-1",
       "service_name": "sagemaker",
       "DataProcessing": {
         "InputFilter": "$.text",
         "JoinSource": "Input",
         "OutputFilter": "$"
       },
       "MaxConcurrentTransforms": 100,
       "ModelName": "DJL-Text-Embedding-Model-imageforjsonlines",
       "TransformInput": {
         "ContentType": "application/json",
         "DataSource": {
           "S3DataSource": {
             "S3DataType": "S3Prefix",
             "S3Uri": "s3://offlinebatch/msmarcotests/"
           }
         },
         "SplitType": "Line"
       },
       "TransformJobName": "djl-batch-transform-1-billion",
       "TransformOutput": {
         "AssembleWith": "Line",
         "Accept": "application/json",
         "S3OutputPath": "s3://offlinebatch/msmarcotestsoutputs/"
       },
       "TransformResources": {
         "InstanceCount": 100,
         "InstanceType": "ml.m4.xlarge"
       },
       "BatchStrategy": "SingleRecord"
     },
     "actions": [
       {
         "action_type": "predict",
         "method": "POST",
         "headers": {
           "content-type": "application/json"
         },
         "url": "https://runtime.sagemaker.us-east-1.amazonaws.com/endpoints/OpenSearch-sagemaker-060124023703/invocations",
         "request_body": "${parameters.input}",
         "pre_process_function": "connector.pre_process.default.embedding",
         "post_process_function": "connector.post_process.default.embedding"
       },
       {
         "action_type": "batch_predict",
         "method": "POST",
         "headers": {
           "content-type": "application/json"
         },
         "url": "https://api.sagemaker.us-east-1.amazonaws.com/CreateTransformJob",
         "request_body": """{ "BatchStrategy": "${parameters.BatchStrategy}", "ModelName": "${parameters.ModelName}", "DataProcessing" : ${parameters.DataProcessing}, "MaxConcurrentTransforms": ${parameters.MaxConcurrentTransforms}, "TransformInput": ${parameters.TransformInput}, "TransformJobName" : "${parameters.TransformJobName}", "TransformOutput" : ${parameters.TransformOutput}, "TransformResources" : ${parameters.TransformResources}}"""
       },
       {
         "action_type": "batch_predict_status",
         "method": "GET",
         "headers": {
           "content-type": "application/json"
         },
         "url": "https://api.sagemaker.us-east-1.amazonaws.com/DescribeTransformJob",
         "request_body": """{ "TransformJobName" : "${parameters.TransformJobName}"}"""
       },
       {
         "action_type": "cancel_batch_predict",
         "method": "POST",
         "headers": {
           "content-type": "application/json"
         },
         "url": "https://api.sagemaker.us-east-1.amazonaws.com/StopTransformJob",
         "request_body": """{ "TransformJobName" : "${parameters.TransformJobName}"}"""
       }
     ]
   }
   ```

1. 반환된 커넥터 ID를 사용하여 SageMaker 모델을 등록합니다.

   ```
   POST /_plugins/_ml/models/_register
   {
       "name": "SageMaker model for batch",
       "function_name": "remote",
       "description": "test model",
       "connector_id": "example123456789-abcde"
   }
   ```

1. `batch_predict` 작업 유형으로 모델을 간접적으로 호출합니다.

   ```
   POST /_plugins/_ml/models/teHr3JABBiEvs-eod7sn/_batch_predict
   {
     "parameters": {
       "TransformJobName": "SM-offline-batch-transform"
     }
   }
   ```

   응답에는 배치 작업에 대한 작업 ID가 포함됩니다.

   ```
   {
    "task_id": "exampleIDabdcefd_1234567",
    "status": "CREATED"
   }
   ```

1. 작업 ID를 사용하여 작업 가져오기 API를 직접적으로 호출하여 배치 작업 상태를 확인합니다.

   ```
   GET /_plugins/_ml/tasks/exampleIDabdcefd_1234567
   ```

   응답에는 작업 상태가 포함됩니다.

   ```
   {
     "model_id": "nyWbv5EB_tT1A82ZCu-e",
     "task_type": "BATCH_PREDICTION",
     "function_name": "REMOTE",
     "state": "RUNNING",
     "input_type": "REMOTE",
     "worker_node": [
       "WDZnIMcbTrGtnR4Lq9jPDw"
     ],
     "create_time": 1725496527958,
     "last_update_time": 1725496527958,
     "is_async": false,
     "remote_job": {
       "TransformResources": {
         "InstanceCount": 1,
         "InstanceType": "ml.c5.xlarge"
       },
       "ModelName": "DJL-Text-Embedding-Model-imageforjsonlines",
       "TransformOutput": {
         "Accept": "application/json",
         "AssembleWith": "Line",
         "KmsKeyId": "",
         "S3OutputPath": "s3://offlinebatch/output"
       },
       "CreationTime": 1725496531.935,
       "TransformInput": {
         "CompressionType": "None",
         "ContentType": "application/json",
         "DataSource": {
           "S3DataSource": {
             "S3DataType": "S3Prefix",
             "S3Uri": "s3://offlinebatch/sagemaker_djl_batch_input.json"
           }
         },
         "SplitType": "Line"
       },
       "TransformJobArn": "arn:aws:sagemaker:us-east-1:111122223333:transform-job/SM-offline-batch-transform15",
       "TransformJobStatus": "InProgress",
       "BatchStrategy": "SingleRecord",
       "TransformJobName": "SM-offline-batch-transform15",
       "DataProcessing": {
         "InputFilter": "$.content",
         "JoinSource": "Input",
         "OutputFilter": "$"
       }
     }
   }
   ```

#### (대안 절차) 1단계: CloudFormation 통합 템플릿을 사용하여 커넥터 및 모델 생성
<a name="configure-clients-ml-commons-configuring-create-connectors-alternative"></a>

원하는 경우 AWS CloudFormation 를 사용하여 ML 추론에 필요한 모든 Amazon SageMaker 커넥터 및 모델을 자동으로 생성할 수 있습니다. 이 방식은 Amazon OpenSearch Service 콘솔에서 사용할 수 있는 사전 구성된 템플릿을 사용하므로 설정이 간소화됩니다. 자세한 내용은 [CloudFormation 를 사용하여 의미 체계 검색을 위한 원격 추론 설정](cfn-template.md) 단원을 참조하십시오.

**필요한 모든 SageMaker 커넥터 및 모델을 생성하는 CloudFormation 스택을 배포하려면**

1. Amazon OpenSearch Service 콘솔을 엽니다.

1. 탐색 창에서 **통합**을 선택합니다.

1. 검색 필드에 **SageMaker**를 입력한 다음 **Amazon SageMaker를 통한 텍스트 임베딩 모델과의 통합**을 선택합니다.

1. **도메인 구성**을 선택한 다음 **VPC 도메인 구성** 또는 **퍼블릭 도메인 구성**을 선택합니다.

1. 템플릿 필드에 정보를 입력합니다. **오프라인 배치 추론 활성화**에서 **true**를 선택하여 오프라인 배치 처리를 위한 리소스를 프로비저닝합니다.

1. **생성을** 선택하여 CloudFormation 스택을 생성합니다.

1. 스택이 생성된 후 CloudFormation 콘솔에서 **출력** 탭을 열고 **connector\$1id**와 **model\$1id**를 찾습니다. 나중에 파이프라인을 구성할 때 이들 값이 필요합니다.

### 2단계: ML 오프라인 배치 추론을 위한 OpenSearch Ingestion 파이프라인 생성
<a name="configure-clients-ml-commons-configuring-pipeline"></a>

다음 샘플을 사용하여 ML 오프라인 배치 추론을 위한 OpenSearch Ingestion 파이프라인을 생성합니다. OpenSearch Ingestion용 파이프라인 생성에 대한 자세한 내용은 [Amazon OpenSearch Ingestion 파이프라인 생성](creating-pipeline.md) 섹션을 참조하세요.

**시작하기 전에**

다음 샘플에서는 `sts_role_arn` 파라미터의 IAM 역할 ARN을 지정합니다. 다음 절차에 따라 이 역할이 OpenSearch의 ml-commons에 액세스할 수 있는 백엔드 역할에 매핑되었는지 확인합니다.

1. OpenSearch Service 도메인에 대한 OpenSearch 대시보드 플러그인으로 이동합니다. OpenSearch Service 콘솔의 도메인 Dashboards에서 Dashboards 엔드포인트를 찾을 수 있습니다.

1. 주 메뉴에서 **보안**, **역할**을 선택하고 **ml\$1full\$1access** 역할을 선택합니다.

1. **매핑된 사용자(Mapped users)**, **매핑 관리(Manage mapping)**를 차례로 선택합니다.

1. **백엔드 역할**에 도메인 호출 권한이 필요한 Lambda 역할의 ARN을 입력합니다. 예: arn:aws:iam::*111122223333*:role/*lambda-role*

1. **Map**(맵)을 선택하고 **Mapped users**(매핑된 사용자)에 사용자 또는 역할이 나타나는지 확인합니다.

**ML 오프라인 배치 추론을 위한 OpenSearch Ingestion 파이프라인을 생성하는 샘플**

```
version: '2'
extension:
  osis_configuration_metadata:
    builder_type: visual
sagemaker-batch-job-pipeline:
  source:
    s3:
      acknowledgments: true
      delete_s3_objects_on_read: false
      scan:
        buckets:
          - bucket:
              name: name
              data_selection: metadata_only
              filter:
                include_prefix:
                  - sagemaker/sagemaker_djl_batch_input
                exclude_suffix:
                  - .manifest
          - bucket:
              name: name
              data_selection: data_only
              filter:
                include_prefix:
                  - sagemaker/output/
        scheduling:
          interval: PT6M
      aws:
        region: name
      default_bucket_owner: account_ID
      codec:
        ndjson:
          include_empty_objects: false
      compression: none
      workers: '1'
  processor:
    - ml_inference:
        host: "https://search-AWStest-offlinebatch-123456789abcdef.us-west-2.es.amazonaws.com"
        aws_sigv4: true
        action_type: "batch_predict"
        service_name: "sagemaker"
        model_id: "model_ID"
        output_path: "s3://AWStest-offlinebatch/sagemaker/output"
        aws:
          region: "us-west-2"
          sts_role_arn: "arn:aws:iam::account_ID:role/Admin"
        ml_when: /bucket == "AWStest-offlinebatch"
        dlq:
          s3:
            region: us-west-2
            bucket: batch-inference-dlq
            key_path_prefix: bedrock-dlq
            sts_role_arn: arn:aws:iam::account_ID:role/OSI-invoke-ml
    - copy_values:
        entries:
          - from_key: /text
            to_key: chapter
          - from_key: /SageMakerOutput
            to_key: chapter_embedding
          - delete_entries:
            with_keys:
          - text
          - SageMakerOutput
  sink:
    - opensearch:
        hosts: ["https://search-AWStest-offlinebatch-123456789abcdef.us-west-2.es.amazonaws.com"]
        aws:
          serverless: false
          region: us-west-2
        routes:
          - ml-ingest-route
        index_type: custom
        index: test-nlp-index
  routes:
    - ml-ingest-route: /chapter != null and /title != null
```

### 3단계: 수집을 위한 데이터 준비
<a name="configure-clients-ml-commons-configuring-data"></a>

ML 오프라인 배치 추론 처리를 위해 데이터를 준비하려면 자체 도구 또는 프로세스를 사용하여 직접 데이터를 준비하거나 [OpenSearch Data Prepper](https://docs.opensearch.org/latest/data-prepper/getting-started/)를 사용합니다. 파이프라인을 사용하여 데이터 소스의 데이터를 사용하거나, 기계 학습 데이터세트를 생성하여 데이터가 올바른 형식으로 구성되어 있는지 확인합니다.

다음 예에서는 자연어 처리 작업에 대한 실제 사용자 쿼리 모음이 포함된 [MS MARCO](https://microsoft.github.io/msmarco/Datasets.html) 데이터세트를 사용합니다. 이 데이터세트는 JSONL 형식으로 구성되어 있습니다. 여기서 각 줄은 ML 임베딩 모델로 전송된 요청을 나타냅니다.

```
{"_id": "1185869", "text": ")what was the immediate impact of the Paris Peace Treaties of 1947?", "metadata": {"world war 2"}}
{"_id": "1185868", "text": "_________ justice is designed to repair the harm to victim, the community and the offender caused by the offender criminal act. question 19 options:", "metadata": {"law"}}
{"_id": "597651", "text": "what is amber", "metadata": {"nothing"}}
{"_id": "403613", "text": "is autoimmune hepatitis a bile acid synthesis disorder", "metadata": {"self immune"}}
...
```

MS MARCO 데이터세트를 사용하여 테스트하기 위해, 각각 1,000만 개의 요청이 포함된 100개의 파일에 분산된 10억 개의 입력 요청을 구성하는 시나리오를 가정해 보겠습니다. 이 파일은 접두사 s3://offlinebatch/sagemaker/sagemaker\$1djl\$1batch\$1input/과 함께 Amazon S3에 저장됩니다. OpenSearch Ingestion 파이프라인은 이러한 100개의 파일을 동시에 스캔하고, 병렬 처리를 위해 100개의 작업자로 SageMaker 배치 작업을 시작하여 10억 개의 문서를 OpenSearch로 효율적으로 벡터화하고 수집합니다.

프로덕션 환경에서는 OpenSearch Ingestion 파이프라인을 사용하여 배치 추론 입력을 위한 S3 파일을 생성할 수 있습니다. 이 파이프라인은 다양한 [데이터 소스](https://docs.opensearch.org/latest/data-prepper/pipelines/configuration/sources/sources/)를 지원하며 일정에 따라 작동하여 소스 데이터를 S3 파일로 지속적으로 변환합니다. 그런 다음 예약된 오프라인 배치 작업을 통해 AI 서버에서 이러한 파일을 자동으로 처리하여 지속적인 데이터 처리와 수집을 보장합니다.

### 4단계: 배치 추론 작업 모니터링
<a name="configure-clients-ml-commons-configuring-monitor"></a>

SageMaker 콘솔 또는 AWS CLI를 사용하여 배치 추론 작업을 모니터링할 수 있습니다. 작업 가져오기 API를 사용하여 배치 작업을 모니터링할 수도 있습니다.

```
GET /_plugins/_ml/tasks/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "state": "RUNNING"
          }
        }
      ]
    }
  },
  "_source": ["model_id", "state", "task_type", "create_time", "last_update_time"]
}
```

이 API는 활성 배치 작업 목록을 반환합니다.

```
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 3,
      "relation": "eq"
    },
    "max_score": 0.0,
    "hits": [
      {
        "_index": ".plugins-ml-task",
        "_id": "nyWbv5EB_tT1A82ZCu-e",
        "_score": 0.0,
        "_source": {
          "model_id": "nyWbv5EB_tT1A82ZCu-e",
          "state": "RUNNING",
          "task_type": "BATCH_PREDICTION",
          "create_time": 1725496527958,
          "last_update_time": 1725496527958
        }
      },
      {
        "_index": ".plugins-ml-task",
        "_id": "miKbv5EB_tT1A82ZCu-f",
        "_score": 0.0,
        "_source": {
          "model_id": "miKbv5EB_tT1A82ZCu-f",
          "state": "RUNNING",
          "task_type": "BATCH_PREDICTION",
          "create_time": 1725496528123,
          "last_update_time": 1725496528123
        }
      },
      {
        "_index": ".plugins-ml-task",
        "_id": "kiLbv5EB_tT1A82ZCu-g",
        "_score": 0.0,
        "_source": {
          "model_id": "kiLbv5EB_tT1A82ZCu-g",
          "state": "RUNNING",
          "task_type": "BATCH_PREDICTION",
          "create_time": 1725496529456,
          "last_update_time": 1725496529456
        }
      }
    ]
  }
}
```

### 5단계: 검색 실행
<a name="configure-clients-ml-commons-configuring-semantic-search"></a>

배치 추론 작업을 모니터링하고 완료를 확인한 후 시맨틱, 하이브리드, 대화형(RAG 사용), 신경망 희소, 멀티모달 등 다양한 유형의 AI 검색을 실행할 수 있습니다. OpenSearch Service에서 지원하는 AI 검색에 대한 자세한 내용은 [AI 검색](https://docs.opensearch.org/latest/vector-search/ai-search/index/)을 참조하세요.

원시 벡터를 검색하려면 `knn` 쿼리 유형을 사용하고, `vector` 배열을 입력으로 제공하고, 반환된 결과의 `k` 수를 지정합니다.

```
GET /my-raw-vector-index/_search
{
  "query": {
    "knn": {
      "my_vector": {
        "vector": [0.1, 0.2, 0.3],
        "k": 2
      }
    }
  }
}
```

AI 기반 검색을 실행하려면 `neural` 쿼리 유형을 사용합니다. `query_text` 입력, OpenSearch Ingestion 파이프라인에서 구성한 임베딩 모델의 `model_id`, 반환된 결과의 `k` 수를 지정합니다. 검색 결과에서 임베딩을 제외하려면 `_source.excludes` 파라미터에 임베딩 필드의 이름을 지정합니다.

```
GET /my-ai-search-index/_search
{
  "_source": {
    "excludes": [
      "output_embedding"
    ]
  },
  "query": {
    "neural": {
      "output_embedding": {
        "query_text": "What is AI search?",
        "model_id": "mBGzipQB2gmRjlv_dOoB",
        "k": 2
      }
    }
  }
}
```

# OpenTelemetry Collector와 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-otel"></a>

[OpenTelemetry Collector](https://opentelemetry.io/docs/collector/)를 사용하여 로그, 추적 및 지표를 OpenSearch Ingestion 파이프라인으로 수집할 수 있습니다. 단일 파이프라인을 사용하여 모든 로그, 추적 및 지표를 도메인 또는 컬렉션의 다른 인덱스에 수집할 수 있습니다. 파이프라인을 사용하여 로그, 추적 또는 지표만 개별적으로 수집할 수도 있습니다.

**Topics**
+ [사전 조건](#otel-prereqs)
+ [1단계: 파이프라인 역할 구성](#otel-pipeline-role)
+ [2단계: 파이프라인 생성](#create-otel-pipeline)
+ [교차 계정 연결](#x-account-connectivity)
+ [제한 사항](#otel-limitations)
+ [OpenTelemetry 소스에 권장되는 CloudWatch 경보](#otel-pipeline-metrics)

## 사전 조건
<a name="otel-prereqs"></a>

[OpenTelemetry 구성 파일을](https://opentelemetry.io/docs/collector/configuration/) 설정하는 동안 수집을 수행하려면 다음을 구성해야 합니다.
+ 수집 역할에는 파이프라인과 상호 작용할 수 있는 `osis:Ingest` 권한이 필요합니다. 자세한 내용은 [수집 역할을 참조하세요](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-same-account).
+ 엔드포인트 값에는 파이프라인 엔드포인트가 포함되어야 합니다. 예: `https://pipeline-endpoint.us-east-1.osis.amazonaws.com.`
+ 서비스 값은 여야 합니다`osis`.
+ OTLP/HTTP Exporter의 압축 옵션은 파이프라인에서 선택한 소스의 압축 옵션과 일치해야 합니다.

```
extensions:
    sigv4auth:
        region: "region"
        service: "osis"

exporters:
    otlphttp:
        logs_endpoint: "https://pipeline-endpoint.us-east-1.osis.amazonaws.com/v1/logs"
        metrics_endpoint: "https://pipeline-endpoint.us-east-1.osis.amazonaws.com/v1/metrics"
        traces_endpoint: "https://pipeline-endpoint.us-east-1.osis.amazonaws.com/v1/traces"
        auth:
            authenticator: sigv4auth
        compression: none

service:
    extensions: [sigv4auth]
    pipelines:
        traces:
        receivers: [jaeger]
        exporters: [otlphttp]
```

## 1단계: 파이프라인 역할 구성
<a name="otel-pipeline-role"></a>

 OpenTelemetry 수집기 구성을 설정한 후 [ 파이프라인 구성에 사용할 파이프라인 역할을 설정합니다](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-sink). 파이프라인 역할에 OTLP 소스에 필요한 특정 권한은 없으며 파이프라인에 OpenSearch 도메인 또는 컬렉션에 대한 액세스 권한을 부여할 수 있는 권한만 있습니다.

## 2단계: 파이프라인 생성
<a name="create-otel-pipeline"></a>

 그런 다음 OTLP를 소스로 지정하는 다음과 같이 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다. OpenTelemetry 로그, 지표 및 추적을 개별 소스로 구성할 수도 있습니다.

OTLP 소스 파이프라인 구성:

```
version: 2
otlp-pipeline:
    source:
        otlp:
            logs_path: /otlp-pipeline/v1/logs
            traces_path: /otlp-pipeline/v1/traces
            metrics_path: /otlp-pipeline/v1/metrics
    sink:
        - opensearch:
            hosts: ["https://search-mydomain.region.es.amazonaws.com"]
            index: "ss4o_metrics-otel-%{yyyy.MM.dd}"
            index_type: custom
            aws:
                region: "region"
```

OpenTelemetry Logs 파이프라인 구성:

```
version: 2
otel-logs-pipeline:
  source:
    otel_logs_source:
        path: /otel-logs-pipeline/v1/logs
  sink:
    - opensearch:
        hosts: ["https://search-mydomain.region.es.amazonaws.com"]
        index: "ss4o_metrics-otel-%{yyyy.MM.dd}"
        index_type: custom
        aws:
            region: "region"
```

OpenTelemetry 지표 파이프라인 구성:

```
version: 2
otel-metrics-pipeline:
  source:
    otel_metrics_source:
        path: /otel-metrics-pipeline/v1/metrics
  sink:
    - opensearch:
        hosts: ["https://search-mydomain.region.es.amazonaws.com"]
        index: "ss4o_metrics-otel-%{yyyy.MM.dd}"
        index_type: custom
        aws:
            region: "region"
```

OpenTelemetry Traces 파이프라인 구성:

```
version: 2
otel-trace-pipeline:
  source:
    otel_trace_source:
        path: /otel-traces-pipeline/v1/traces
  sink:
    - opensearch:
        hosts: ["https://search-mydomain.region.es.amazonaws.com"]
        index: "ss4o_metrics-otel-%{yyyy.MM.dd}"
        index_type: custom
        aws:
            region: "region"
```

사전 구성된 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

## 교차 계정 연결
<a name="x-account-connectivity"></a>

 OpenTelemetry 소스가 있는 OpenSearch Ingestion 파이프라인에는 교차 계정 수집 기능이 있습니다. OpenTelemetry Amazon OpenSearch Ingestion을 사용하면 Virtual Private Cloud(VPC) AWS 계정 에서 별도의 VPC의 파이프라인 엔드포인트로 파이프라인을 공유할 수 있습니다. 자세한 내용은 [교차 계정 수집을 위한 OpenSearch Ingestion 파이프라인 구성](cross-account-pipelines.md) 단원을 참조하십시오.

## 제한 사항
<a name="otel-limitations"></a>

 OpenSearch Ingestion 파이프라인은 20mb를 초과하는 요청을 수신할 수 없습니다. 이 값은 `max_request_length` 옵션에서 사용자가 구성합니다. 이 옵션은 기본적으로 10mb입니다.

## OpenTelemetry 소스에 권장되는 CloudWatch 경보
<a name="otel-pipeline-metrics"></a>

 수집 파이프라인의 성능을 모니터링하려면 다음 CloudWatch 지표가 권장됩니다. 이러한 지표는 내보내기에서 처리된 데이터의 양, 스트림에서 처리된 이벤트의 양, 내보내기 및 스트림 이벤트 처리 오류, 대상에 쓴 문서 수를 식별하는 데 도움이 될 수 있습니다. 이러한 지표 중 하나가 지정된 시간 동안 지정된 값을 초과하면 작업을 수행하도록 CloudWatch 경보를 설정할 수 있습니다.

 OTLP 소스에 대한 CloudWatch 지표는 형식으로 지정됩니다`{pipeline-name}.otlp.{logs | traces | metrics}.{metric-name}`. 예를 들어 `otel-pipeline.otlp.metrics.requestTimeouts.count`입니다.

 개별 OpenTelemetry 소스를 사용하는 경우 지표는 형식으로 지정됩니다`{pipeline-name}.{source-name}.{metric-name}`. 예를 들어 `trace-pipeline.otel_trace_source.requestTimeouts.count`입니다.

세 OpenTelemetry 데이터 형식은 모두 동일한 지표를 가지지만 간결하게 설명하면 지표는 OTLP 소스 로그 형식 데이터에 대한 아래 표에만 나열됩니다.


| 지표 | 설명 | 
| --- |--- |
| otel-pipeline.BlockingBuffer.bufferUsage.value |  사용 중인 버퍼의 양을 나타냅니다.  | 
|  otel-pipeline.otlp.logs.requestTimeouts.count  |  시간 초과된 요청 수입니다.  | 
|  otel-pipeline.otlp.logs.requestsReceived.count  |  OpenTelemetry Collector에서 수신한 요청 수입니다.  | 
|  otel-pipeline.otlp.logs.badRequests.count  |  OpenTelemetry Collector에서 수신한 잘못된 형식의 요청 수입니다.  | 
|  otel-pipeline.otlp.logs.requestsTooLarge.count  |  OpenTelemetry Collector에서 수신한 최대 20mb보다 큰 요청 수입니다.  | 
|  otel-pipeline.otlp.logs.internalServerError.count  | The number of HTTP 500 errors received from the OpenTelemetry Collector. | 
|  otel-pipeline.opensearch.bulkBadRequestErrors.count  | Count of errors during bulk requests due to malformed request. | 
|  otel-pipeline.opensearch.bulkRequestLatency.avg  | Average latency for bulk write requests made to OpenSearch. | 
|  otel-pipeline.opensearch.bulkRequestNotFoundErrors.count  | Number of bulk requests that failed because the target data could not be found. | 
|  otel-pipeline.opensearch.bulkRequestNumberOfRetries.count  | Number of retries by OpenSearch Ingestion pipelines to write OpenSearch cluster. | 
|  otel-pipeline.opensearch.bulkRequestSizeBytes.sum  | Total size in bytes of all bulk requests made to OpenSearch. | 
|  otel-pipeline.opensearch.documentErrors.count  | Number of errors when sending documents to OpenSearch. The documents causing the errors witll be sent to DLQ. | 
|  otel-pipeline.opensearch.documentsSuccess.count  | Number of documents successfully written to an OpenSearch cluster or collection. | 
|  otel-pipeline.opensearch.documentsSuccessFirstAttempt.count  | Number of documents successfully indexed in OpenSearch on the first attempt. | 
|  `otel-pipeline.opensearch.documentsVersionConflictErrors.count`  | Count of errors due to version conflicts in documents during processing. | 
|  `otel-pipeline.opensearch.PipelineLatency.avg`  | Average latency of OpenSearch Ingestion pipeline to process the data by reading from the source to writing to the destination. | 
|  otel-pipeline.opensearch.PipelineLatency.max  | Maximum latency of OpenSearch Ingestion pipeline to process the data by reading from the source to writing the destination. | 
|  otel-pipeline.opensearch.recordsIn.count  | Count of records successfully ingested into OpenSearch. This metric is essential for tracking the volume of data being processed and stored. | 
|  otel-pipeline.opensearch.s3.dlqS3RecordsFailed.count  | Number of records that failed to write to DLQ. | 
|  otel-pipeline.opensearch.s3.dlqS3RecordsSuccess.count  | Number of records that are written to DLQ. | 
|  otel-pipeline.opensearch.s3.dlqS3RequestLatency.count  | Count of latency measurements for requests to the Amazon S3 dead-letter queue. | 
|  otel-pipeline.opensearch.s3.dlqS3RequestLatency.sum  | Total latency for all requests to the Amazon S3 dead-letter queue | 
|  otel-pipeline.opensearch.s3.dlqS3RequestSizeBytes.sum  | Total size in bytes of all requests made to the Amazon S3 dead-letter queue. | 
|  otel-pipeline.recordsProcessed.count  | Total number of records processed in the pipeline, a key metric for overal throughput. | 
|  `otel-pipeline.opensearch.bulkRequestInvalidInputErrors.count`  | Count of bulk request errors in OpenSearch due to invalid input, crucial for monitoring data quality and operational issues. | 

# Amazon Managed Service for Prometheus에서 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-prometheus"></a>

Amazon Managed Service for Prometheus를 OpenSearch Ingestion 파이프라인의 대상으로 사용하여 지표를 시계열 형식으로 저장할 수 있습니다. Prometheus 싱크를 사용하면 파이프라인의 OpenTelemetry 지표 또는 기타 시계열 데이터를 모니터링, 알림 및 분석을 위해 Amazon Managed Service for Prometheus 워크스페이스로 전송할 수 있습니다.

`prometheus` 싱크 플러그인을 사용하면 OpenSearch Ingestion 파이프라인이 Prometheus 원격 쓰기 프로토콜을 사용하여 Amazon Managed Service for Prometheus 워크스페이스에 지표 데이터를 쓸 수 있습니다. 이 통합을 통해 다음을 수행할 수 있습니다.
+ Amazon Managed Service for Prometheus에 시계열 지표 데이터 저장
+ Amazon Managed Service for Prometheus 및 Amazon Managed Grafana를 사용하여 지표 모니터링 및 알림
+ 지표를 여러 대상으로 동시에 라우팅(예: OpenSearch 및 Amazon Managed Service for Prometheus)
+ 외부 에이전트의 OpenTelemetry 지표를 처리하거나 파이프라인 내에서 지표를 생성합니다.

**Topics**
+ [사전 조건](#prometheus-prereqs)
+ [1단계: 파이프라인 역할 구성](#prometheus-pipeline-role)
+ [2단계: 파이프라인 생성](#prometheus-pipeline)
+ [모니터링 및 문제 해결](#prometheus-monitoring)
+ [제한 사항](#prometheus-limitations)
+ [모범 사례](#prometheus-best-practices)

## 사전 조건
<a name="prometheus-prereqs"></a>

Prometheus 싱크를 구성하기 전에 다음이 있는지 확인합니다.
+ **Amazon Managed Service for Prometheus 워크**스페이스: OpenSearch Ingestion 파이프라인 AWS 리전 과 동일한 AWS 계정 및에 워크스페이스를 생성합니다. 지침은 *Amazon Managed Service for Prometheus 사용 설명서*의 [워크스페이스 생성을](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-create-workspace.html) 참조하세요.
+ **IAM 권한**: Amazon Managed Service for Prometheus에 쓸 수 있는 권한이 있는 IAM 역할을 구성합니다. 자세한 내용은 [1단계: 파이프라인 역할 구성](#prometheus-pipeline-role) 단원을 참조하십시오.

**참고**  
Amazon Managed Service for Prometheus 워크스페이스는 AWS 서비스 관리형 AWS KMS 키를 사용해야 합니다. 고객 관리형 AWS KMS 키는 현재 OpenSearch Ingestion 파이프라인의 Amazon Managed Service for Prometheus 싱크에서 지원되지 않습니다.

## 1단계: 파이프라인 역할 구성
<a name="prometheus-pipeline-role"></a>

Prometheus 싱크는 인증에 대한 [파이프라인 역할의](pipeline-security-overview.md#pipeline-security-sink) IAM 권한을 자동으로 상속하므로 싱크 설정에서 추가 역할 구성(예: `sts_role_arn`)이 필요하지 않습니다.

다음 샘플 정책은 Amazon Managed Service for Prometheus를 싱크로 사용하는 데 필요한 권한을 보여줍니다.

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AMPRemoteWrite",
      "Effect": "Allow",
      "Action": [
        "aps:RemoteWrite"
      ],
      "Resource": "arn:aws:aps:region:account-id:workspace/workspace-id"
    }
  ]
}
```

다음과 같이 자리 표시자를 바꿉니다.
+ `region`: ( AWS 리전 예: `us-east-1`)
+ `account-id`: ID AWS 계정 
+ `workspace-id`: Amazon Managed Service for Prometheus 워크스페이스 ID

파이프라인 역할에 이러한 권한을 연결해야 합니다.

파이프라인 역할에 OpenSearch Ingestion이 이를 수임할 수 있는 신뢰 관계가 있는지 확인합니다.

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "osis-pipelines.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

## 2단계: 파이프라인 생성
<a name="prometheus-pipeline"></a>

권한을 설정한 후 Amazon Managed Service for Prometheus를 싱크로 사용하도록 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

### 기본 구성
<a name="prometheus-basic-config"></a>

다음 예제에서는 최소 Prometheus 싱크 구성을 보여줍니다.

```
version: "2"
sink:
  - prometheus:
      url: "https://aps-workspaces.region.amazonaws.com/workspaces/workspace-id/api/v1/remote_write"
      aws:
        region: "region"
```

`prometheus` 싱크 구성 내에서 Amazon Managed Service for Prometheus 원격 쓰기 엔드포인트인 `url` 옵션을 지정해야 합니다. URL의 형식을 지정하려면 Amazon Managed Service for Prometheus 콘솔에서 워크스페이스 ID를 찾고 다음과 같이 URL을 구성합니다`https://aps-workspaces.region.amazonaws.com/workspaces/workspace-id/api/v1/remote_write`.

### 구성 옵션
<a name="prometheus-config-options"></a>

다음 옵션을 사용하여 Prometheus 싱크에 대한 일괄 처리 및 플러시 동작을 구성합니다.


**Prometheus 싱크 구성 옵션**  

| 옵션 | 필수 | Type | 설명 | 
| --- | --- | --- | --- | 
| max\$1events | 아니요 | Integer | Prometheus로 플러시하기 전에 누적할 최대 이벤트 수입니다. 기본값은 1000입니다. | 
| max\$1request\$1size | 아니요 | 바이트 수 | 플러시 전 요청 페이로드의 최대 크기입니다. 기본값은 1mb입니다. | 
| flush\$1interval | 아니요 | 지속 시간 | 이벤트를 플러시하기 전에 대기하는 최대 시간입니다. 기본값은 10s입니다. 허용되는 최대 값은 입니다60s. | 

### 파이프라인 예제
<a name="prometheus-example-pipelines"></a>

**예제 1: Amazon Managed Service for Prometheus에 대한 OpenTelemetry 지표**

이 파이프라인은 외부 에이전트로부터 OpenTelemetry 지표를 수신하여 Amazon Managed Service for Prometheus에 기록합니다.

```
version: "2"
source:
  otel_metrics_source:
    path: "/v1/metrics"
    output_format: otel

sink:
  - prometheus:
      url: "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111/api/v1/remote_write"
      aws:
        region: "us-east-1"
```

**예제 2: 듀얼 싱크 - OpenSearch 및 Amazon Managed Service for Prometheus**

이 파이프라인은 OpenSearch와 Amazon Managed Service for Prometheus 모두에 지표를 라우팅합니다.

```
version: "2"
source:
  otel_metrics_source:
    path: "/v1/metrics"
    output_format: otel

sink:
  - opensearch:
      hosts:
        - "https://search-domain-endpoint.us-east-1.es.amazonaws.com"
      index: "metrics-%{yyyy.MM.dd}"
      aws:
        region: "us-east-1"
        sts_role_arn: "arn:aws:iam::123456789012:role/OSI-Pipeline-Role"

  - prometheus:
      url: "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111/api/v1/remote_write"
      aws:
        region: "us-east-1"
```

**예제 3: 필터링이 포함된 지표**

이 파이프라인은 Amazon Managed Service for Prometheus로 전송하기 전에 지표를 필터링합니다.

```
version: "2"
source:
  otel_metrics_source:
    path: "/v1/metrics"
    output_format: otel

processor:
  - drop_events:
      drop_when: '/name != "http.server.duration" and /name != "http.client.duration"'

sink:
  - prometheus:
      url: "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111/api/v1/remote_write"
      aws:
        region: "us-east-1"
```

사전 구성된 Amazon Managed Service for Prometheus 블루프린트를 사용하여 이러한 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

### Amazon Managed Service for Prometheus 싱크를 사용하여 파이프라인 생성
<a name="prometheus-create-pipeline"></a>

#### AWS 콘솔 사용
<a name="prometheus-console"></a>

1. OpenSearch Service 콘솔로 이동합니다.

1. **수집**에서 **파이프라인**을 선택합니다.

1. [**파이프라인 생성**]을 선택합니다.

1. **블루프린트를 사용하여 빌드**를 선택하고 **Amazon Prometheus 블루프린트에 대한 OpenTelemetry 지표**를 선택합니다.

1. 파이프라인을 구성합니다.
   + Amazon Managed Service for Prometheus 워크스페이스 ID 입력
   + 파이프라인 역할 ARN 지정
   + 필요에 따라 소스 및 프로세서 설정 구성

1. 파이프라인을 검토하고 생성합니다.

#### AWS CLI 사용
<a name="prometheus-cli"></a>

원하는 구성으로 파이프라인 구성 파일(예: `amp-pipeline.yaml`)을 생성한 다음 다음을 실행합니다.

```
aws osis create-pipeline \
  --pipeline-name my-amp-pipeline \
  --min-units 2 \
  --max-units 4 \
  --pipeline-configuration-body file://amp-pipeline.yaml
```

#### 사용 AWS CloudFormation
<a name="prometheus-cfn"></a>

```
Resources:
  MyAMPPipeline:
    Type: AWS::OSIS::Pipeline
    Properties:
      PipelineName: my-amp-pipeline
      MinUnits: 2
      MaxUnits: 4
      PipelineConfigurationBody: |
        version: "2"
        source:
          otel_metrics_source:
            path: "/v1/metrics"
            output_format: otel
        sink:
          - prometheus:
              url: "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111/api/v1/remote_write"
              aws:
                region: "us-east-1"
```

## 모니터링 및 문제 해결
<a name="prometheus-monitoring"></a>

### CloudWatch 지표
<a name="prometheus-cloudwatch-metrics"></a>

CloudWatch 지표를 사용하여 파이프라인의 성능을 모니터링합니다.
+ `DocumentsWritten`: Amazon Managed Service for Prometheus에 성공적으로 기록된 지표 수
+ `DocumentsWriteFailed`: 쓰기에 실패한 지표 수
+ `RequestLatency`: 원격 쓰기 요청의 지연 시간

### 일반적인 문제
<a name="prometheus-troubleshooting"></a>

**문제**: 파이프라인이 Amazon Managed Service for Prometheus에 쓰지 못함

**솔루션:**
+ URL의 워크스페이스 ID 및 리전이 올바른지 확인
+ 파이프라인 역할에 `aps:RemoteWrite` 권한이 있는지 확인합니다.
+ 워크스페이스가 서비스 관리형 AWS KMS 키를 사용하는지 확인
+ 파이프라인과 워크스페이스가 동일한지 확인 AWS 계정

**문제**: 인증 오류

**솔루션:**
+ 신뢰 관계가이 파이프라인 역할을 수임`osis-pipelines.amazonaws.com`하도록 허용하는지 확인
+ 파이프라인 역할에 필요한 `aps:RemoteWrite` 권한이 있는지 확인합니다.

**문제**: 높은 지연 시간 또는 제한

**솔루션:**
+ 파이프라인 용량 단위 증가
+ 프로세서에서 일괄 처리 구현
+ Amazon Managed Service for Prometheus 서비스 할당량 검토

## 제한 사항
<a name="prometheus-limitations"></a>

Amazon Managed Service for Prometheus용 OpenSearch Ingestion 파이프라인을 설정할 때 다음 제한 사항을 고려하세요.
+ Amazon Managed Service for Prometheus 워크스페이스는 서비스 관리형 AWS KMS 키를 사용해야 AWS 합니다. 고객 관리형 AWS KMS 키는 현재 지원되지 않습니다.
+ 파이프라인과 Amazon Managed Service for Prometheus 워크스페이스는 동일한에 있어야 합니다 AWS 계정.

## 모범 사례
<a name="prometheus-best-practices"></a>
+ **동일한 IAM 역할 사용**: Prometheus 싱크는 파이프라인 역할을 자동으로 사용합니다. 다른 싱크를 사용하는 경우 `sts_role_arn`가 파이프라인 역할과 동일한지 확인합니다.
+ **지표 모니터링**: 실패한 쓰기 및 긴 지연 시간에 대한 CloudWatch 경보 설정
+ **필터링 구현**: Amazon Managed Service for Prometheus로 전송하기 전에 프로세서를 사용하여 불필요한 지표 필터링
+ **적절한 크기 용량**: 최소 용량으로 시작하고 지표 볼륨에 따라 확장
+ **블루프린트 사용**: 일반적인 사용 사례에 대해 사전 구성된 블루프린트 활용

# Kafka에서 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-self-managed-kafka"></a>

[Kafka](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/kafka/) 플러그인을 사용하여 자체 관리형 Kafka 클러스터의 데이터를 Amazon OpenSearch Service 도메인 및 OpenSearch Serverless 컬렉션으로 스트리밍할 수 있습니다. OpenSearch Ingestion은 퍼블릭 또는 프라이빗(VPC) 네트워킹으로 구성된 Kafka 클러스터의 연결을 지원합니다. 이 주제에서는 상호 TLS(mTLS), SASL/SCRAM 또는 IAM과 같은 네트워크 설정 및 인증 방법 구성을 비롯하여, 수집 파이프라인을 설정하기 위한 사전 조건과 단계를 간략하게 설명합니다.

## 퍼블릭 Kafka 클러스터에서 데이터 마이그레이션
<a name="self-managaged-kafka-public"></a>

OpenSearch Ingestion 파이프라인을 사용하여 자체 관리형 퍼블릭 Kafka 클러스터에서 데이터를 마이그레이션할 수 있습니다. 즉, 도메인 DNS 이름을 공개적으로 확인할 수 있습니다. 이렇게 하려면 자체 관리형 Kafka를 소스로, OpenSearch Service 또는 OpenSearch Serverless를 대상으로 하는 OpenSearch Ingestion 파이프라인을 설정합니다. 이렇게 하면 자체 관리형 소스 클러스터에서 AWS관리형 대상 도메인 또는 컬렉션으로 스트리밍 데이터가 처리됩니다.

### 사전 조건
<a name="self-managaged-kafka-public-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. 퍼블릭 네트워크 구성을 사용하여 자체 관리형 Kafka 클러스터를 생성합니다. 클러스터에는 OpenSearch Service로 수집할 데이터가 포함되어 있어야 합니다.

1. 데이터를 마이그레이션할 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](createupdatedomains.md#createdomains) 및 [컬렉션 생성](serverless-create.md) 섹션을 참조하세요.

1. 를 사용하여 자체 관리형 클러스터에 인증을 설정합니다 AWS Secrets Manager. [AWS Secrets Manager 시크릿 교체](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)의 단계를 수행하여 시크릿 교체를 활성화합니다.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 자체 관리형 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

   다음 샘플 도메인 액세스 정책은 다음 단계에서 생성하는 파이프라인 역할을 사용하여 도메인에 데이터를 쓰도록 허용합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::444455556666:role/pipeline-role"
         },
         "Action": [
           "es:DescribeDomain",
           "es:ESHttp*"
         ],
         "Resource": [
           "arn:aws:es:us-east-1:111122223333:domain/domain-name"
         ]
       }
     ]
   }
   ```

------

   컬렉션 또는 도메인에 쓰기 데이터에 액세스할 수 있는 올바른 권한이 있는 IAM 역할을 생성하려면 [Amazon OpenSearch Ingestion 내 역할 및 사용자 설정](pipeline-security-overview.md)을 참조하세요.

### 1단계: 파이프라인 역할 구성
<a name="self-managed-kafka-public-pipeline-role"></a>

Kafka 파이프라인 사전 조건을 설정한 후 파이프라인 구성에 사용할 [파이프라인 역할을 구성](pipeline-security-overview.md#pipeline-security-sink)하고 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션에 쓸 수 있는 권한과 Secrets Manager에서 시크릿을 읽을 수 있는 권한을 추가합니다.

### 2단계: 파이프라인 생성
<a name="self-managed-kafka-public-pipeline"></a>

이제 Kafka를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

여러 OpenSearch Service 도메인을 데이터의 대상으로 지정할 수 있습니다. 이 기능을 사용하여 조건부로 라우팅하거나 수신 데이터를 여러 OpenSearch Service 도메인으로 복제할 수 있습니다.

소스 Confluent Kafka의 데이터를 OpenSearch Serverless VPC 컬렉션으로 마이그레이션할 수도 있습니다. 파이프라인 구성 내에서 네트워크 액세스 정책을 제공해야 합니다. Confluent 스키마 레지스트리를 사용하여 Confluent 스키마를 정의할 수 있습니다.

```
version: "2"
kafka-pipeline:
  source:
    kafka:
      encryption:
        type: "ssl"
      topics:
        - name: "topic-name"
          group_id: "group-id"
      bootstrap_servers:
        - "bootstrap-server.us-east-1.aws.private.confluent.cloud:9092"
      authentication:
        sasl:
          plain:
            username: ${aws_secrets:confluent-kafka-secret:username}
            password: ${aws_secrets:confluent-kafka-secret:password}
      schema:
        type: confluent
        registry_url: https://my-registry.us-east-1.aws.confluent.cloud
        api_key: "${{aws_secrets:schema-secret:schema_registry_api_key}}"
        api_secret: "${{aws_secrets:schema-secret:schema_registry_api_secret}}"
        basic_auth_credentials_source: "USER_INFO"
  sink:
  - opensearch:
      hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
      aws:
          region: "us-east-1"
      index: "confluent-index"
extension:
  aws:
    secrets:
      confluent-kafka-secret:
        secret_id: "my-kafka-secret"
        region: "us-east-1"
      schema-secret:
        secret_id: "my-self-managed-kafka-schema"
        region: "us-east-1"
```

사전 구성된 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

### VPC의 Kafka 클러스터에서 데이터 마이그레이션
<a name="self-managaged-kafka-private"></a>

OpenSearch Ingestion 파이프라인을 사용하여 VPC에서 실행되는 자체 관리형 Kafka 클러스터에서 데이터를 마이그레이션할 수도 있습니다. 이렇게 하려면 자체 관리형 Kafka를 소스로, OpenSearch Service 또는 OpenSearch Serverless를 대상으로 하는 OpenSearch Ingestion 파이프라인을 설정합니다. 이렇게 하면 자체 관리형 소스 클러스터에서 AWS관리형 대상 도메인 또는 컬렉션으로 스트리밍 데이터가 처리됩니다.

#### 사전 조건
<a name="self-managaged-kafka-private-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. OpenSearch Service로 수집하려는 데이터가 포함된 VPC 네트워크 구성을 사용하여 자체 관리형 Kafka 클러스터를 생성합니다.

1. 데이터를 마이그레이션할 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains) 및 [컬렉션 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html#serverless-create)을 참조하세요.

1. 를 사용하여 자체 관리형 클러스터에 인증을 설정합니다 AWS Secrets Manager. [AWS Secrets Manager 시크릿 교체](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)의 단계를 수행하여 시크릿 교체를 활성화합니다.

1. 자체 관리형 Kafka에 대한 액세스 권한을 보유한 VPC의 ID를 가져옵니다. OpenSearch Ingestion에서 사용할 VPC CIDR을 선택합니다.
**참고**  
를 사용하여 파이프라인 AWS Management Console 을 생성하는 경우 자체 관리형 Kafka를 사용하려면 OpenSearch Ingestion 파이프라인도 VPC에 연결해야 합니다. 이를 수행하려면 **네트워크 구성** 섹션을 찾아 **VPC에 연결** 확인란을 선택하고 제공된 기본 옵션 중 하나에서 CIDR을 선택하거나 직접 선택합니다. [RFC 1918 Best Current Practice](https://datatracker.ietf.org/doc/html/rfc1918)에 정의된 대로 프라이빗 주소 공간에서 모든 CIDR을 사용할 수 있습니다.  
사용자 지정 CIDR을 제공하려면 드롭다운 메뉴에서 **기타**를 선택합니다. OpenSearch Ingestion과 자체 관리형 OpenSearch 간의 IP 주소 충돌을 방지하려면 자체 관리형 OpenSearch VPC CIDR이 OpenSearch Ingestion의 CIDR과 달라야 합니다.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 자체 관리형 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

   다음 샘플 도메인 액세스 정책은 다음 단계에서 생성하는 파이프라인 역할을 사용하여 도메인에 데이터를 쓰도록 허용합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::444455556666:role/pipeline-role"
         },
         "Action": [
           "es:DescribeDomain",
           "es:ESHttp*"
         ],
         "Resource": [
           "arn:aws:es:us-east-1:111122223333:domain/domain-name"
         ]
       }
     ]
   }
   ```

------

   컬렉션 또는 도메인에 쓰기 데이터에 액세스할 수 있는 올바른 권한이 있는 IAM 역할을 생성하려면 [Amazon OpenSearch Ingestion 내 역할 및 사용자 설정](pipeline-security-overview.md)을 참조하세요.

#### 1단계: 파이프라인 역할 구성
<a name="self-managed-kafka-private-pipeline-role"></a>

파이프라인 사전 조건을 설정한 후 파이프라인 구성에서 사용하려는 [파이프라인 역할을 구성](pipeline-security-overview.md#pipeline-security-sink)하고 역할에서 다음 권한을 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SecretsManagerReadAccess",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": ["arn:aws:secretsmanager:us-east-1:111122223333:secret:secret-name"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AttachNetworkInterface",
                "ec2:CreateNetworkInterface",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:DeleteNetworkInterface",
                "ec2:DeleteNetworkInterfacePermission",
                "ec2:DetachNetworkInterface",
                "ec2:DescribeNetworkInterfaces"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeDhcpOptions",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        { 
            "Effect": "Allow",
            "Action": [ 
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:*:*:network-interface/*",
            "Condition": { 
               "StringEquals": 
                    {
                        "aws:RequestTag/OSISManaged": "true"
                    } 
            } 
        }
    ]
}
```

------

파이프라인은 이러한 권한을 사용하여 VPC에서 네트워크 인터페이스를 생성하고 삭제하므로 OpenSearch Ingestion 파이프라인을 생성하는 데 사용하는 IAM 역할에서 위의 Amazon EC2 권한을 제공해야 합니다. 파이프라인은 오직 이 네트워크 인터페이스를 통해 Kafka 클러스터에 액세스할 수 있습니다.

#### 2단계: 파이프라인 생성
<a name="self-managed-kafka-private-pipeline"></a>

이제 Kafka를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

여러 OpenSearch Service 도메인을 데이터의 대상으로 지정할 수 있습니다. 이 기능을 사용하여 조건부로 라우팅하거나 수신 데이터를 여러 OpenSearch Service 도메인으로 복제할 수 있습니다.

소스 Confluent Kafka의 데이터를 OpenSearch Serverless VPC 컬렉션으로 마이그레이션할 수도 있습니다. 파이프라인 구성 내에서 네트워크 액세스 정책을 제공해야 합니다. Confluent 스키마 레지스트리를 사용하여 Confluent 스키마를 정의할 수 있습니다.

```
 version: "2"
kafka-pipeline:
  source:
    kafka:
      encryption:
        type: "ssl"
      topics:
        - name: "topic-name"
          group_id: "group-id"
      bootstrap_servers:
        - "bootstrap-server.us-east-1.aws.private.confluent.cloud:9092"
      authentication:
        sasl:
          plain:
            username: ${aws_secrets:confluent-kafka-secret:username}
            password: ${aws_secrets:confluent-kafka-secret:password}
      schema:
        type: confluent
        registry_url: https://my-registry.us-east-1.aws.confluent.cloud
        api_key: "${{aws_secrets:schema-secret:schema_registry_api_key}}"
        api_secret: "${{aws_secrets:schema-secret:schema_registry_api_secret}}"
        basic_auth_credentials_source: "USER_INFO"
  sink:
  - opensearch:
      hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
      aws:
          region: "us-east-1"
      index: "confluent-index"
extension:
  aws:
    secrets:
      confluent-kafka-secret:
        secret_id: "my-kafka-secret"
        region: "us-east-1"
      schema-secret:
        secret_id: "my-self-managed-kafka-schema"
        region: "us-east-1"
```

사전 구성된 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

# Amazon OpenSearch Ingestion을 사용하여 자체 관리 OpenSearch 클러스터에서 데이터 마이그레이션
<a name="configure-client-self-managed-opensearch"></a>

자체 관리형 Amazon OpenSearch 또는 Elasticsearch에서 OpenSearch Ingestion 파이프라인을 사용하여 Amazon OpenSearch Service 도메인 또는 OpenSearch Serverless VPC 컬렉션으로 데이터를 마이그레이션할 수 있습니다. OpenSearch Ingestion은 자체 관리형 OpenSearch 및 Elasticsearch에서 데이터를 마이그레이션하기 위해 퍼블릭 및 프라이빗 네트워크 구성을 모두 지원합니다.

## 퍼블릭 OpenSearch 클러스터에서 마이그레이션
<a name="self-managaged-opensearch-public"></a>

OpenSearch Ingestion 파이프라인을 사용하여 퍼블릭 구성을 통해 자체 관리형 OpenSearch 또는 Elasticsearch 클러스터에서 데이터를 마이그레이션할 수 있습니다. 즉, 도메인 DNS 이름을 공개적으로 확인할 수 있습니다. 이렇게 하려면 자체 관리형 OpenSearch 또는 Elasticsearch를 소스로, OpenSearch Service 또는 OpenSearch Serverless를 대상으로 하는 OpenSearch Ingestion 파이프라인을 설정합니다. 이렇게 하면 자체 관리형 소스 클러스터에서 AWS관리형 대상 도메인 또는 컬렉션으로 데이터를 효과적으로 마이그레이션할 수 있습니다.

### 사전 조건
<a name="self-managaged-opensearch-public-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. 퍼블릭 DNS 이름을 마이그레이션하고 구성하려는 데이터가 포함된 자체 관리형 OpenSearch 또는 Elastisearch 클러스터를 생성합니다. 지침은 OpenSearch 설명서의 [클러스터 생성](https://opensearch.org/docs/latest/tuning-your-cluster/)을 참조하세요.

1. 데이터를 마이그레이션할 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](createupdatedomains.md#createdomains) 및 [컬렉션 생성](serverless-create.md) 섹션을 참조하세요.

1. 를 사용하여 자체 관리형 클러스터에 인증을 설정합니다 AWS Secrets Manager. [AWS Secrets Manager 시크릿 교체](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)의 단계를 수행하여 시크릿 교체를 활성화합니다.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 자체 관리형 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

   다음 샘플 도메인 액세스 정책은 다음 단계에서 생성하는 파이프라인 역할을 사용하여 도메인에 데이터를 쓰도록 허용합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::444455556666:role/pipeline-role"
         },
         "Action": [
           "es:DescribeDomain",
           "es:ESHttp*"
         ],
         "Resource": [
           "arn:aws:es:us-east-1:111122223333:domain/domain-name"
         ]
       }
     ]
   }
   ```

------

   컬렉션 또는 도메인에 쓰기 데이터에 액세스할 수 있는 올바른 권한이 있는 IAM 역할을 생성하려면 [Amazon OpenSearch Ingestion 내 역할 및 사용자 설정](pipeline-security-overview.md)을 참조하세요.

### 1단계: 파이프라인 역할 구성
<a name="self-managed-opensearch-public-pipeline-role"></a>

OpenSearch 파이프라인 사전 조건을 설정한 후 파이프라인 구성에 사용할 [파이프라인 역할을 구성](pipeline-security-overview.md#pipeline-security-sink)하고 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션에 쓸 수 있는 권한과 Secrets Manager에서 시크릿을 읽을 수 있는 권한을 추가합니다.

### 2단계: 파이프라인 생성
<a name="self-managed-opensearch-public-pipeline"></a>

이제 OpenSearch를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

여러 OpenSearch Service 도메인을 데이터의 대상으로 지정할 수 있습니다. 이 기능을 사용하여 조건부로 라우팅하거나 수신 데이터를 여러 OpenSearch Service 도메인으로 복제할 수 있습니다.

소스 OpenSearch 또는 Elasticsearch 클러스터의 데이터를 OpenSearch Serverless VPC 컬렉션으로 마이그레이션할 수도 있습니다. 파이프라인 구성 내에서 네트워크 액세스 정책을 제공해야 합니다.

```
version: "2"
opensearch-migration-pipeline:
  source:
    opensearch:
      acknowledgments: true
      host: [ "https://my-self-managed-cluster-name:9200" ]
      indices:
        include:
          - index_name_regex: "include-.*"
        exclude:
          - index_name_regex: '\..*'
      authentication:
        username: ${aws_secrets:secret:username}
        password: ${aws_secrets:secret:password}
        scheduling:
           interval: "PT2H"
           index_read_count: 3
           start_time: "2023-06-02T22:01:30.00Z"
  sink:
  - opensearch:
      hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
      aws:
          region: "us-east-1"
          #Uncomment the following lines if your destination is an OpenSearch Serverless collection
          #serverless: true
          # serverless_options:
          #     network_policy_name: "network-policy-name"
      index: "${getMetadata(\"opensearch-index\")}"
      document_id: "${getMetadata(\"opensearch-document_id\")}"
      enable_request_compression: true
      dlq:
        s3:
          bucket: "bucket-name"
          key_path_prefix: "apache-log-pipeline/logs/dlq"
          region: "us-east-1"
extension:
  aws:
    secrets:
      secret:
        secret_id: "my-opensearch-secret"
        region: "us-east-1"
        refresh_interval: PT1H
```

사전 구성된 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

## VPC의 OpenSearch 클러스터에서 데이터 마이그레이션
<a name="self-managaged-opensearch-private"></a>

OpenSearch Ingestion 파이프라인을 사용하여 VPC에서 실행되는 자체 관리형 OpenSearch 또는 Elasticsearch 클러스터에서 데이터를 마이그레이션할 수도 있습니다. 이렇게 하려면 자체 관리형 OpenSearch 또는 Elasticsearch를 소스로, OpenSearch Service 또는 OpenSearch Serverless를 대상으로 하는 OpenSearch Ingestion 파이프라인을 설정합니다. 이렇게 하면 자체 관리형 소스 클러스터에서 AWS관리형 대상 도메인 또는 컬렉션으로 데이터를 효과적으로 마이그레이션할 수 있습니다.

### 사전 조건
<a name="self-managaged-opensearch-private-prereqs"></a>

OpenSearch Ingestion 파이프라인을 생성하기 전에 다음 단계를 수행하세요.

1. 마이그레이션하려는 데이터가 포함된 VPC 네트워크 구성을 사용하여 자체 관리형 OpenSearch 또는 Elastisearch 클러스터를 생성합니다.

1. 데이터를 마이그레이션할 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 생성합니다. 자세한 내용은 [OpenSearch Service 도메인 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/createupdatedomains.html#createdomains) 및 [컬렉션 생성](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-manage.html#serverless-create)을 참조하세요.

1. 를 사용하여 자체 관리형 클러스터에 인증을 설정합니다 AWS Secrets Manager. [AWS Secrets Manager 시크릿 교체](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)의 단계를 수행하여 시크릿 교체를 활성화합니다.

1. 자체 관리형 OpenSearch 또는 Elasticsearch에 대한 액세스 권한을 보유한 VPC의 ID를 가져옵니다. OpenSearch Ingestion에서 사용할 VPC CIDR을 선택합니다.
**참고**  
를 사용하여 파이프라인 AWS Management Console 을 생성하는 경우 자체 관리형 OpenSearch 또는 Elasticsearch를 사용하려면 OpenSearch Ingestion 파이프라인도 VPC에 연결해야 합니다. 이를 수행하려면 **소스 네트워크 옵션** 섹션을 찾아 **VPC에 연결** 확인란을 선택하고 제공된 기본 옵션 중 하나에서 CIDR을 선택합니다. [RFC 1918 Best Current Practice](https://datatracker.ietf.org/doc/html/rfc1918)에 정의된 대로 프라이빗 주소 공간에서 모든 CIDR을 사용할 수 있습니다.  
사용자 지정 CIDR을 제공하려면 드롭다운 메뉴에서 **기타**를 선택합니다. OpenSearch Ingestion과 자체 관리형 OpenSearch 간의 IP 주소 충돌을 방지하려면 자체 관리형 OpenSearch VPC CIDR이 OpenSearch Ingestion의 CIDR과 달라야 합니다.

1. [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 도메인에 연결하거나 [데이터 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html)을 컬렉션에 연결합니다. 이러한 액세스 정책을 통해 OpenSearch Ingestion은 자체 관리형 클러스터의 데이터를 도메인 또는 컬렉션에 쓸 수 있습니다.

   다음 샘플 도메인 액세스 정책은 다음 단계에서 생성하는 파이프라인 역할을 사용하여 도메인에 데이터를 쓰도록 허용합니다. 자체 ARN으로 `resource`을 업데이트해야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::444455556666:role/pipeline-role"
         },
         "Action": [
           "es:DescribeDomain",
           "es:ESHttp*"
         ],
         "Resource": [
           "arn:aws:es:us-east-1:111122223333:domain/example.com"
         ]
       }
     ]
   }
   ```

------

   컬렉션 또는 도메인에 쓰기 데이터에 액세스할 수 있는 올바른 권한이 있는 IAM 역할을 생성하려면 [Amazon OpenSearch Ingestion 내 역할 및 사용자 설정](pipeline-security-overview.md)을 참조하세요.

### 1단계: 파이프라인 역할 구성
<a name="self-managed-opensearch-private-pipeline-role"></a>

파이프라인 사전 조건을 설정한 후 파이프라인 구성에서 사용하려는 [파이프라인 역할을 구성](pipeline-security-overview.md#pipeline-security-sink)하고 역할에서 다음 권한을 추가합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SecretsManagerReadAccess",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": ["arn:aws:secretsmanager:us-east-1:111122223333:secret:secret-name"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AttachNetworkInterface",
                "ec2:CreateNetworkInterface",
                "ec2:CreateNetworkInterfacePermission",
                "ec2:DeleteNetworkInterface",
                "ec2:DeleteNetworkInterfacePermission",
                "ec2:DetachNetworkInterface",
                "ec2:DescribeNetworkInterfaces"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:security-group/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeDhcpOptions",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        { 
            "Effect": "Allow",
            "Action": [ 
                "ec2:CreateTags"
            ],
            "Resource": "arn:aws:ec2:*:*:network-interface/*",
            "Condition": { 
               "StringEquals": 
                    {
                        "aws:RequestTag/OSISManaged": "true"
                    } 
            } 
        }
    ]
}
```

------

파이프라인은 이러한 권한을 사용하여 VPC에서 네트워크 인터페이스를 생성하고 삭제하므로 OpenSearch Ingestion 파이프라인을 생성하는 데 사용하는 IAM 역할에서 위의 Amazon EC2 권한을 제공해야 합니다. 파이프라인은 오직 이 네트워크 인터페이스를 통해 OpenSearch 클러스터에 액세스할 수 있습니다.

### 2단계: 파이프라인 생성
<a name="self-managed-opensearch-private-pipeline"></a>

이제 OpenSearch를 소스로 지정하는 다음과 같은 OpenSearch Ingestion 파이프라인을 구성할 수 있습니다.

여러 OpenSearch Service 도메인을 데이터의 대상으로 지정할 수 있습니다. 이 기능을 사용하여 조건부로 라우팅하거나 수신 데이터를 여러 OpenSearch Service 도메인으로 복제할 수 있습니다.

소스 OpenSearch 또는 Elasticsearch 클러스터의 데이터를 OpenSearch Serverless VPC 컬렉션으로 마이그레이션할 수도 있습니다. 파이프라인 구성 내에서 네트워크 액세스 정책을 제공해야 합니다.

```
version: "2"
opensearch-migration-pipeline:
  source:
    opensearch:
      acknowledgments: true
      host: [ "https://my-self-managed-cluster-name:9200" ]
      indices:
        include:
          - index_name_regex: "include-.*"
        exclude:
          - index_name_regex: '\..*'
      authentication:
        username: ${aws_secrets:secret:username}
        password: ${aws_secrets:secret:password}
        scheduling:
           interval: "PT2H"
           index_read_count: 3
           start_time: "2023-06-02T22:01:30.00Z"
  sink:
  - opensearch:
      hosts: ["https://search-mydomain.us-east-1.es.amazonaws.com"]
      aws:
          region: "us-east-1"
          #Uncomment the following lines if your destination is an OpenSearch Serverless collection
          #serverless: true
          # serverless_options:
          #     network_policy_name: "network-policy-name"
      index: "${getMetadata(\"opensearch-index\")}"
      document_id: "${getMetadata(\"opensearch-document_id\")}"
      enable_request_compression: true
      dlq:
        s3:
          bucket: "bucket-name"
          key_path_prefix: "apache-log-pipeline/logs/dlq"
          region: "us-east-1"
extension:
  aws:
    secrets:
      secret:
        secret_id: "my-opensearch-secret"
        region: "us-east-1"
        refresh_interval: PT1H
```

사전 구성된 블루프린트를 사용하여 이 파이프라인을 생성할 수 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

# Amazon Kinesis Data Streams와 함께 OpenSearch Ingestion 파이프라인 사용
<a name="configure-client-kinesis"></a>

Amazon Kinesis Data Streams와 함께 OpenSearch Ingestion 파이프라인을 사용하여 여러 스트림의 스트림 레코드 데이터를 Amazon OpenSearch Service 도메인 및 컬렉션으로 수집합니다. OpenSearch Ingestion 파이프라인은 스트리밍 수집 인프라를 통합하여 Kinesis에서 스트림 레코드를 짧은 지연 시간으로, 대규모로, 지속적으로 수집할 수 있도록 지원합니다.

**Topics**
+ [소스로서의 Amazon Kinesis Data Streams](#confluent-cloud-kinesis)
+ [소스로서의 Amazon Kinesis Data Streams 교차 계정](#kinesis-cross-account-source)

## 소스로서의 Amazon Kinesis Data Streams
<a name="confluent-cloud-kinesis"></a>

다음 절차에서는 Amazon Kinesis Data Streams를 데이터 소스로 사용하는 OpenSearch Ingestion 파이프라인을 설정하는 방법을 알아봅니다. 이 섹션에서는 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션을 생성하고, 파이프라인 역할을 구성하고, 파이프라인을 생성하는 단계를 안내하는 등 필요한 사전 조건을 다룹니다.

### 사전 조건
<a name="s3-prereqs"></a>

파이프라인을 설정하려면 활성 Kinesis Data Streams가 하나 이상 필요합니다. 이 스트림은 레코드를 수신하거나 다른 소스에서 레코드를 수신할 준비가 되어 있어야 합니다. 자세한 내용은 [OpenSearch Ingestion 개요](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/osis-getting-started-tutorials.html)를 참조하세요.

**파이프라인을 설정하려면**

1. 

**OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션 생성**

   도메인 또는 컬렉션을 생성하려면 [OpenSearch Ingestion 시작하기](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/osis-getting-started-tutorials.html)를 참조하세요.

   컬렉션 또는 도메인에 쓰기 데이터에 액세스할 수 있는 올바른 권한이 있는 IAM 역할을 생성하려면 [리소스 기반 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)을 참조하세요.

1. 

**권한을 사용하여 파이프라인 역할 구성**

   [파이프라인 구성에 사용할 파이프라인 역할을 설정](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/pipeline-security-overview.html#pipeline-security-sink)하고 다음 권한을 추가합니다. *자리 표시자*를 자신의 정보로 바꿉니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "allowReadFromStream",
               "Effect": "Allow",
               "Action": [
                   "kinesis:DescribeStream",
                   "kinesis:DescribeStreamConsumer",
                   "kinesis:DescribeStreamSummary",
                   "kinesis:GetRecords",
                   "kinesis:GetShardIterator",
                   "kinesis:ListShards",
                   "kinesis:ListStreams",
                   "kinesis:ListStreamConsumers",
                   "kinesis:RegisterStreamConsumer",
                   "kinesis:SubscribeToShard"
               ],
               "Resource": [
                   "arn:aws:kinesis:us-east-1:111122223333:stream/stream-name"
               ]
           }
       ]
   }
   ```

------

   스트림에서 서버 측 암호화가 활성화된 경우 다음 AWS KMS 정책은 레코드를 복호화하도록 허용합니다. *자리 표시자*를 자신의 정보로 바꿉니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "allowDecryptionOfCustomManagedKey",
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt",
                   "kms:GenerateDataKey"
               ],
               "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id"
           }
       ]
   }
   ```

------

   파이프라인이 도메인에 데이터를 쓰려면 도메인에 **sts\$1role\$1arn** 파이프라인 역할이 도메인에 액세스할 수 있도록 허용하는 [도메인 수준 액세스 정책](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/ac.html#ac-types-resource)이 있어야 합니다.

   다음은 이전 단계에서 생성한 파이프라인 역할(`pipeline-role`)을 사용하여 `ingestion-domain` 도메인에 데이터를 쓰도록 허용하는 도메인 액세스 정책의 예입니다. *자리 표시자*를 자신의 정보로 바꿉니다.

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::your-account-id:role/pipeline-role"
         },
         "Action": ["es:DescribeDomain", "es:ESHttp*"],
         "Resource": "arn:aws:es:AWS 리전:account-id:domain/domain-name/*"
       }
     ]
   }
   ```

1. 

**파이프라인 생성**

   **Kinesis-data-streams**를 원본으로 지정하는 OpenSearch Ingestion 파이프라인을 구성합니다. OpenSearch Ingestion 콘솔에서 이러한 파이프라인을 생성하는 데 사용 가능한 준비된 블루프린트를 찾을 수 있습니다. (선택 사항)를 사용하여 파이프라인을 생성하려면 "**`AWS-KinesisDataStreamsPipeline`**"라는 블루프린트를 사용할 AWS CLI수 있습니다. *자리 표시자*를 자신의 정보로 바꿉니다.

   ```
   version: "2"
   kinesis-pipeline:
     source:
       kinesis_data_streams:
         acknowledgments: true
         codec:
           # Based on whether kinesis records are aggregated or not, you could choose json, newline or ndjson codec for processing the records.
           # JSON codec supports parsing nested CloudWatch Events into individual log entries that will be written as documents into OpenSearch.
           # json:
             # key_name: "logEvents"
             # These keys contain the metadata sent by CloudWatch Subscription Filters
             # in addition to the individual log events:
             # include_keys: [ 'owner', 'logGroup', 'logStream' ]
           newline:
         streams:
           - stream_name: "stream name"
             # Enable this if ingestion should start from the start of the stream.
             # initial_position: "EARLIEST"
             # checkpoint_interval: "PT5M"
             # Compression will always be gzip for CloudWatch, but will vary for other sources:
             # compression: "gzip"
           - stream_name: "stream name"
             # Enable this if ingestion should start from the start of the stream.
             # initial_position: "EARLIEST"
             # checkpoint_interval: "PT5M"
             # Compression will always be gzip for CloudWatch, but will vary for other sources:
             # compression: "gzip"
   
           # buffer_timeout: "1s"
           # records_to_accumulate: 100
           # Change the consumer strategy to "polling". Default consumer strategy will use enhanced "fan-out" supported by KDS.
           # consumer_strategy: "polling"
           # if consumer strategy is set to "polling", enable the polling config below.
           # polling:
             # max_polling_records: 100
             # idle_time_between_reads: "250ms"
         aws:
           # Provide the Role ARN with access to Amazon Kinesis Data Streams. This role should have a trust relationship with osis-pipelines.amazonaws.com
           sts_role_arn: "arn:aws:iam::111122223333:role/Example-Role"
           # Provide the AWS 리전 of the Data Stream.
           region: "us-east-1"
   
     sink:
       - opensearch:
           # Provide an Amazon OpenSearch Serverless domain endpoint
           hosts: [ "https://search-mydomain-1a2a3a4a5a6a7a8a9a0a9a8a7a.us-east-1.es.amazonaws.com" ]
           index: "index_${getMetadata(\"stream_name\")}"
           # Ensure adding unique document id as a combination of the metadata attributes available.
           document_id: "${getMetadata(\"partition_key\")}_${getMetadata(\"sequence_number\")}_${getMetadata(\"sub_sequence_number\")}"
           aws:
             # Provide a Role ARN with access to the domain. This role should have a trust relationship with osis-pipelines.amazonaws.com
             sts_role_arn: "arn:aws:iam::111122223333:role/Example-Role"
             # Provide the AWS 리전 of the domain.
             region: "us-east-1"
             # Enable the 'serverless' flag if the sink is an Amazon OpenSearch Serverless collection
             serverless: false
             # serverless_options:
               # Specify a name here to create or update network policy for the serverless collection
               # network_policy_name: "network-policy-name"
           # Enable the 'distribution_version' setting if the OpenSearch Serverless domain is of version Elasticsearch 6.x
           # distribution_version: "es6"
           # Enable and switch the 'enable_request_compression' flag if the default compression setting is changed in the domain. See https://docs.aws.amazon.com/opensearch-service/latest/developerguide/gzip.html
           # enable_request_compression: true/false
           # Optional: Enable the S3 DLQ to capture any failed requests in an S3 bucket. Delete this entire block if you don't want a DLQ.
           dlq:
             s3:
               # Provide an S3 bucket
               bucket: "your-dlq-bucket-name"
               # Provide a key path prefix for the failed requests
               # key_path_prefix: "kinesis-pipeline/logs/dlq"
               # Provide the region of the bucket.
               region: "us-east-1"
               # Provide a Role ARN with access to the bucket. This role should have a trust relationship with osis-pipelines.amazonaws.com
               sts_role_arn: "arn:aws:iam::111122223333:role/Example-Role"
   ```

**구성 옵션**  
Kinesis 구성 옵션은 *OpenSearch* 설명서의 [구성 옵션](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/sources/kinesis/#configuration-options)을 참조하세요.

**사용 가능한 메타데이터 속성**
   + **stream\$1name** - 레코드가 수집된 Kinesis Data Streams의 이름
   + **partition\$1key** - 수집 중인 Kinesis Data Streams 레코드의 파티션 키
   + **sequence\$1number** – 수집 중인 Kinesis Data Streams 레코드의 시퀀스 번호
   + **sub\$1sequence\$1number** – 수집 중인 Kinesis Data Streams 레코드의 하위 시퀀스 번호

1. 

**(선택 사항) Kinesis Data Streams 파이프라인의 권장 컴퓨팅 유닛(OCU) 구성**

   둘 이상의 스트림에서 스트림 레코드를 수집하도록 OpenSearch Kinesis Data Streams 소스 파이프라인을 구성할 수도 있습니다. 수집 속도를 높이려면 추가된 새 스트림당 컴퓨팅 유닛을 추가하는 것이 좋습니다.

### 데이터 일관성
<a name="confluent-cloud-kinesis-private"></a>

OpenSearch Ingestion은 데이터 내구성을 보장하는 엔드 투 엔드 승인을 지원합니다. 파이프라인은 Kinesis에서 스트림 레코드를 읽을 때 스트림과 연결된 샤드를 기반으로 스트림 레코드를 읽는 작업을 동적으로 분산합니다. 파이프라인은 OpenSearch 도메인이나 컬렉션에서 모든 레코드를 수집한 후 승인을 받으면 스트림을 자동으로 체크포인트합니다. 이렇게 하면 스트림 레코드의 중복 처리가 방지됩니다.

스트림 이름을 기반으로 인덱스를 생성하려면 OpenSearch 싱크 섹션의 인덱스를 **"index\$1\$1\$1getMetadata(\$1"stream\$1name\$1")\$1"**로 정의합니다.

## 소스로서의 Amazon Kinesis Data Streams 교차 계정
<a name="kinesis-cross-account-source"></a>

OpenSearch Ingestion 파이프라인이 소스로서 다른 계정의 Kinesis Data Streams에 액세스할 수 있도록 Amazon Kinesis Data Streams가 있는 여러 계정에서 액세스 권한을 부여할 수 있습니다. 교차 계정 액세스를 활성화하려면 다음 단계를 수행합니다.

**교차 계정 액세스 구성**

1. 

**Kinesis 스트림이 있는 계정에서 리소스 정책 설정**

   *자리 표시자*를 자신의 정보로 바꿉니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "StreamReadStatementID",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/Pipeline-Role"
               },
               "Action": [
                   "kinesis:DescribeStreamSummary",
                   "kinesis:GetRecords",
                   "kinesis:GetShardIterator",
                   "kinesis:ListShards"
               ],
               "Resource": "arn:aws:kinesis:us-east-1:444455556666:stream/stream-name"
           },
           {
               "Sid": "StreamEFOReadStatementID",
               "Effect": "Allow",
               "Principal": {
                   "AWS": "arn:aws:iam::111122223333:role/Pipeline-Role"
               },
               "Action": [
                   "kinesis:DescribeStreamSummary",
                   "kinesis:ListShards"
               ],
               "Resource": "arn:aws:kinesis:us-east-1:444455556666:stream/stream-name/consumer/consumer-name"
           }
       ]
   }
   ```

------

1. 

**(선택 사항) 소비자 및 소비자 리소스 정책 설정**

   이는 선택적 단계이며 스트림 레코드 읽기에 향상된 팬아웃 소비자 전략을 사용할 계획인 경우에만 필요합니다. 자세한 내용은 [전용 처리량으로 향상된 팬아웃 소비자 개발](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html)을 참조하세요.

   1. 

**소비자 설정**

      기존 소비자를 재사용하려는 경우 이 단계를 건너뛸 수 있습니다. 자세한 내용은 *Amazon Kinesis Data Streams API 참조*에서 [RegisterStreamConsumer](https://docs.aws.amazon.com/dms/latest/APIReference/API_RegisterStreamConsumer.html)를 참조하세요.

      다음 CLI 명령 예에서는 *자리 표시자 값*을 자신의 정보로 바꿉니다.  
**Example CLI 명령 예제:**  

      ```
      aws kinesis register-stream-consumer \
      --stream-arn "arn:aws:kinesis:AWS 리전:account-id:stream/stream-name" \
      --consumer-name consumer-name
      ```

   1. 

**소비자 리소스 정책 설정**

      다음 문에서는 *자리 표시자 값*을 자신의 정보로 바꿉니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "ConsumerEFOReadStatementID",
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:role/Pipeline-Role"
                  },
                  "Action": [
                      "kinesis:DescribeStreamConsumer",
                      "kinesis:SubscribeToShard"
                  ],
                  "Resource": "arn:aws:kinesis:us-east-1:444455556666:stream/stream-1/consumer/consumer-name"
              }
          ]
      }
      ```

------

1. 

**파이프라인 구성**

   교차 계정 수집의 경우 각 스트림에 대해 `kinesis_data_streams`에 다음 속성을 추가합니다.
   + `stream_arn` - 스트림이 있는 계정에 속한 스트림의 ARN
   + `consumer_arn` - 선택적 속성으로, 기본 향상된 팬아웃 소비자 전략을 선택한 경우 지정해야 합니다. 이 필드에는 실제 소비자 ARN을 지정합니다. *자리 표시자*를 자신의 정보로 바꿉니다.

   ```
   version: "2"
        kinesis-pipeline:
          source:
            kinesis_data_streams:
              acknowledgments: true
              codec:
                newline:
              streams:
                - stream_arn: "arn:aws:kinesis:region:stream-account-id:stream/stream-name"
                  consumer_arn: "consumer arn"
                  # Enable this if ingestion should start from the start of the stream.
                  # initial_position: "EARLIEST"
                  # checkpoint_interval: "PT5M"
                - stream_arn: "arn:aws:kinesis:region:stream-account-id:stream/stream-name"
                  consumer_arn: "consumer arn"
                   # initial_position: "EARLIEST"
        
                # buffer_timeout: "1s"
                # records_to_accumulate: 100
                # Enable the consumer strategy to "polling". Default consumer strategy will use enhanced "fan-out" supported by KDS.
                # consumer_strategy: "polling"
                # if consumer strategy is set to "polling", enable the polling config below.
                # polling:
                  # max_polling_records: 100
                  # idle_time_between_reads: "250ms"
              aws:
                # Provide the Role ARN with access to Kinesis. This role should have a trust relationship with osis-pipelines.amazonaws.com
                sts_role_arn: "arn:aws:iam::111122223333:role/Example-Role"
                # Provide the AWS 리전 of the domain.
                region: "us-east-1"
        
          sink:
            - opensearch:
                # Provide an OpenSearch Serverless domain endpoint
                hosts: [ "https://search-mydomain-1a2a3a4a5a6a7a8a9a0a9a8a7a.us-east-1.es.amazonaws.com" ]
                index: "index_${getMetadata(\"stream_name\")}"
                # Mapping for documentid based on partition key, shard sequence number and subsequence number metadata attributes
                document_id: "${getMetadata(\"partition_key\")}_${getMetadata(\"sequence_number\")}_${getMetadata(\"sub_sequence_number\")}"
                aws:
                  # Provide a Role ARN with access to the domain. This role should have a trust relationship with osis-pipelines.amazonaws.com
                  sts_role_arn: "arn:aws:iam::111122223333:role/Example-Role"
                  # Provide the AWS 리전 of the domain.
                  region: "us-east-1"
                  # Enable the 'serverless' flag if the sink is an OpenSearch Serverless collection
                  serverless: false
                    # serverless_options:
                    # Specify a name here to create or update network policy for the serverless collection
                  # network_policy_name: network-policy-name
                # Enable the 'distribution_version' setting if the OpenSearch Serverless domain is of version Elasticsearch 6.x
                # distribution_version: "es6"
                # Enable and switch the 'enable_request_compression' flag if the default compression setting is changed in the domain. See https://docs.aws.amazon.com/opensearch-service/latest/developerguide/gzip.html
                # enable_request_compression: true/false
                # Optional: Enable the S3 DLQ to capture any failed requests in an S3 bucket. Delete this entire block if you don't want a DLQ.
                dlq:
                  s3:
                    # Provide an Amazon S3 bucket
                    bucket: "your-dlq-bucket-name"
                    # Provide a key path prefix for the failed requests
                    # key_path_prefix: "alb-access-log-pipeline/logs/dlq"
                    # Provide the AWS 리전 of the bucket.
                    region: "us-east-1"
                    # Provide a Role ARN with access to the bucket. This role should have a trust relationship with osis-pipelines.amazonaws.com
                    sts_role_arn: "arn:aws:iam::111122223333:role/Example-Role"
   ```

1. 

**OSI 파이프라인 역할 Kinesis Data Streams**

   1. 

**IAM 정책**

      다음 정책을 파이프라인 역할에 추가합니다. *자리 표시자*를 자신의 정보로 바꿉니다.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "kinesis:DescribeStreamConsumer",
                      "kinesis:SubscribeToShard"
                  ],
                  "Resource": [
                  "arn:aws:kinesis:us-east-1:111122223333:stream/my-stream"
                  ]
              },
              {
                  "Sid": "allowReadFromStream",
                  "Effect": "Allow",
                  "Action": [
                      "kinesis:DescribeStream",
                      "kinesis:DescribeStreamSummary",
                      "kinesis:GetRecords",
                      "kinesis:GetShardIterator",
                      "kinesis:ListShards",
                      "kinesis:ListStreams",
                      "kinesis:ListStreamConsumers",
                      "kinesis:RegisterStreamConsumer"
                  ],
                  "Resource": [
                      "arn:aws:kinesis:us-east-1:111122223333:stream/my-stream"
                  ]
              }
          ]
      }
      ```

------

   1. 

**신뢰 정책**

      스트림 계정에서 데이터를 수집하려면 파이프라인 수집 역할과 스트림 계정 간에 신뢰 관계를 설정해야 합니다. 파이프라인 역할에 다음을 추가합니다. *자리 표시자*를 자신의 정보로 바꿉니다.

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [{
           "Effect": "Allow",
           "Principal": {
             "AWS": "arn:aws:iam::111122223333:root"
            },
           "Action": "sts:AssumeRole"
        }]
      }
      ```

------

## 다음 단계
<a name="configure-client-next"></a>

데이터를 파이프라인으로 내보낸 후 파이프라인의 싱크로 구성된 OpenSearch Service 도메인에서 [데이터를 쿼리](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/searching.html)할 수 있습니다. 다음 리소스는 시작하는 데 도움이 됩니다.
+ [Amazon OpenSearch Service의 Observability](observability.md)
+ [트레이스 검색](observability-analyze-traces.md)
+ [Amazon OpenSearch Service의 Observability](observability.md)

# 에서 OpenSearch Ingestion 파이프라인 사용 AWS Lambda
<a name="configure-client-lambda"></a>

[AWS Lambda 프로세서](https://opensearch.org/docs/latest/data-prepper/pipelines/configuration/processors/aws-lambda/)에서 사용자 지정 코드를 사용하여 OpenSearch Ingestion에서 지원하는 모든 소스 또는 대상의 데이터를 보강합니다. Lambda 프로세서를 사용하면 자체 데이터 변환 또는 보강을 적용한 다음 처리된 이벤트를 파이프라인에 반환하여 추가 처리를 수행할 수 있습니다. 이 프로세서를 사용하면 사용자 지정 데이터 처리를 활성화하고 파이프라인을 통과하기 전에 데이터가 조작되는 방식을 완벽하게 제어할 수 있습니다.

**참고**  
Lambda 프로세서에서 처리하는 단일 이벤트의 페이로드 크기 제한은 5MB입니다. 또한 Lambda 프로세서는 JSON 배열 형식의 응답만 지원합니다.

## 사전 조건
<a name="configure-clients-lambda-prereqs"></a>

Lambda 프로세서를 사용하여 파이프라인을 생성하기 전에 다음 리소스를 생성합니다.
+ 소스 데이터를 보강하고 변환하는 AWS Lambda 함수입니다. 지침은 [첫 번째 Lambda 함수 생성](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)을 참조하세요.
+ 파이프라인 싱크가 될 OpenSearch Service 도메인 또는 OpenSearch Serverless 컬렉션입니다. 자세한 내용은 [OpenSearch Service 도메인 생성](createupdatedomains.md#createdomains) 및 [컬렉션 생성](serverless-create.md) 섹션을 참조하세요.
+ 도메인 또는 컬렉션 싱크에 쓸 권한이 포함된 파이프라인 역할입니다. 자세한 내용은 [파이프라인 역할](pipeline-security-overview.md#pipeline-security-sink) 단원을 참조하십시오.

  파이프라인 역할에는 파이프라인 구성에 지정된 Lambda 함수를 호출할 수 있는 연결된 권한 정책도 필요합니다. 예제: 

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "allowinvokeFunction",
              "Effect": "Allow",
              "Action": [
                  "lambda:invokeFunction",
                  "lambda:InvokeAsync",
                  "lambda:ListFunctions"
              ],
              "Resource": "arn:aws:lambda:us-east-1:111122223333:function:function-name"
              
          }
      ]
  }
  ```

------

## 파이프라인 생성
<a name="configure-clients-security-lake-pipeline-role"></a>

를 프로세서 AWS Lambda 로 사용하려면 OpenSearch Ingestion 파이프라인을 구성하고를 프로세서`aws_lambda`로 지정합니다. **AWS Lambda 사용자 지정 보강** 블루프린트를 사용하여 파이프라인을 생성할 수도 있습니다. 자세한 내용은 [블루프린트 작업](pipeline-blueprint.md) 단원을 참조하십시오.

다음 예제 파이프라인은 HTTP 소스에서 데이터를 수신하고, 날짜 프로세서와 AWS Lambda 프로세서를 사용하여 데이터를 보강하고, 처리된 데이터를 OpenSearch 도메인에 수집합니다.

```
version: "2"
lambda-processor-pipeline:
  source:
    http:
      path: "/${pipelineName}/logs"
  processor:
      - date:
        destination: "@timestamp"
        from_time_received: true
    - aws_lambda:
        function_name: "my-lambda-function"

        tags_on_failure: ["lambda_failure"]
        batch:
            key_name: "events"
        aws:
          region: region
  sink:
    - opensearch:
        hosts: [ "https://search-mydomain.us-east-1es.amazonaws.com" ]
        index: "table-index"
        aws:
          region: "region"
          serverless: false
```

다음 예제 AWS Lambda 함수는 제공된 이벤트 배열의 각 요소에 새 키-값 페어(`"transformed": "true"`)를 추가하여 수신 데이터를 변환한 다음 수정된 버전을 다시 보냅니다.

```
import json

def lambda_handler(event, context):
    input_array = event.get('events', [])
    output = []
    for input in input_array:
        input["transformed"] = "true";
        output.append(input)

    return output
```

## 배칭
<a name="configure-clients-lambda-batching"></a>

파이프라인은 배치 이벤트를 Lambda 프로세서로 전송하고 배치 크기를 동적으로 조정하여 5MB 한도 미만으로 유지되도록 합니다.

다음은 파이프라인 배치의 예입니다.

```
batch:
    key_name: "events"

input_arrary = event.get('events', [])
```

**참고**  
파이프라인을 생성할 때 Lambda 프로세서 구성의 `key_name` 옵션이 Lambda 핸들러의 이벤트 키와 일치하는지 확인합니다.

## 조건부 필터링
<a name="configure-clients-lambda-conditional-filtering"></a>

조건부 필터링을 사용하면 AWS Lambda 프로세서가 이벤트 데이터의 특정 조건을 기반으로 Lambda 함수를 호출하는 시기를 제어할 수 있습니다. 이는 다른 이벤트를 무시하면서 특정 유형의 이벤트를 선택적으로 처리하려는 경우에 특히 유용합니다.

다음 구성 예에서는 조건부 필터링을 사용합니다.

```
processors:
  - aws_lambda:
      function_name: "my-lambda-function"
      aws:
        region: "region"
      lambda_when: "/sourceIp == 10.10.10.10"
```