Amazon OpenSearch 서버리스 컬렉션에 데이터 수집 - 아마존 OpenSearch 서비스

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

Amazon OpenSearch 서버리스 컬렉션에 데이터 수집

이 섹션에서는 Amazon OpenSearch Serverless 컬렉션으로의 데이터 통합을 위해 지원되는 수집 파이프라인에 대한 세부 정보를 제공합니다. 또한 API 작업과 상호 작용하는 데 사용할 수 있는 일부 클라이언트도 다룹니다. OpenSearch OpenSearch 서버리스와 통합하려면 클라이언트가 OpenSearch 2.x와 호환되어야 합니다.

최소 필수 권한

데이터를 OpenSearch 서버리스 컬렉션으로 수집하려면 데이터를 쓰는 주체에게 데이터 액세스 정책에서 다음과 같은 최소 권한이 할당되어야 합니다.

[ { "Rules":[ { "ResourceType":"index", "Resource":[ "index/target-collection/logs" ], "Permission":[ "aoss:CreateIndex", "aoss:WriteDocument", "aoss:UpdateIndex" ] } ], "Principal":[ "arn:aws:iam::123456789012:user/my-user" ] } ]

추가 인덱스에 쓰려는 경우 권한이 더 광범위할 수 있습니다. 예를 들어 단일 대상 인덱스를 지정하는 대신 모든 인덱스(index/target-collection/*) 또는 인덱스 하위 집합(index/target-collection/logs*)에 대한 권한을 허용할 수 있습니다.

사용 가능한 모든 OpenSearch API 작업 및 관련 권한에 대한 참조는 을 참조하십시오. Amazon OpenSearch 서버리스에서 지원되는 작업 및 플러그인

OpenSearch 인제스트

타사 클라이언트를 사용하여 OpenSearch 서버리스 컬렉션으로 직접 데이터를 보내는 대신 Amazon OpenSearch Ingestion을 사용할 수 있습니다. OpenSearch Ingestion으로 데이터를 보내도록 데이터 생산자를 구성하면 지정한 컬렉션에 데이터가 자동으로 전달됩니다. 또한 OpenSearch Ingestion을 구성하여 데이터를 전송하기 전에 데이터를 변환할 수 있습니다. 자세한 정보는 아마존 OpenSearch 인제션을 참조하세요.

통합 파이프라인에는 OpenSearch 싱크로 구성된 OpenSearch 서버리스 컬렉션에 쓸 수 있는 권한이 필요합니다. 이러한 권한에는 컬렉션을 설명하고 컬렉션에 HTTP 요청을 보내는 기능이 포함됩니다. OpenSearch Ingestion을 사용하여 컬렉션에 데이터를 추가하는 방법에 대한 지침은 을 참조하십시오. Amazon 통합 파이프라인에 OpenSearch 컬렉션에 대한 액세스 권한 부여

처리를 시작하려면 OpenSearch 을 참조하십시오. 자습서: Amazon OpenSearch Ingestion을 사용하여 컬렉션에 데이터 수집

Fluent Bit

Fluent Bit 이미지 및 OpenSearch 출력AWS 플러그인을 사용하여 서버리스 컬렉션으로 데이터를 수집할 수 있습니다. OpenSearch

참고

서버리스와 통합하려면 Fluent AWS Bit용 이미지 버전 2.30.0 이상이 있어야 합니다. OpenSearch

구성의 예제:

구성 파일의 이 샘플 출력 섹션에서는 OpenSearch 서버리스 컬렉션을 대상으로 사용하는 방법을 보여줍니다. 중요한 추가 사항은 AWS_Service_Name 파라미터인 aoss입니다. Host는 컬렉션 엔드포인트입니다.

[OUTPUT] Name opensearch Match * Host collection-endpoint.us-west-2.aoss.amazonaws.com Port 443 Index my_index Trace_Error On Trace_Output On AWS_Auth On AWS_Region <region> AWS_Service_Name aoss tls On Suppress_Type_Name On

Amazon Data Firehose

Firehose는 OpenSearch 서버리스를 전송 대상으로 지원합니다. OpenSearch 서버리스로 데이터를 전송하는 방법에 대한 지침은 Amazon Data Firehose 개발자 안내서의 Kinesis Data Firehose 전송 스트림 생성 및 대상으로 서버리스 OpenSearch 선택을 참조하십시오.

전송을 위해 Firehose에 제공하는 IAM 역할은 대상 컬렉션에 대한 최소 권한이 있는 aoss:WriteDocument 데이터 액세스 정책 내에서 지정되어야 하며 데이터를 전송할 기존 인덱스가 있어야 합니다. 자세한 정보는 최소 필수 권한을 참조하세요.

OpenSearch 서버리스로 데이터를 전송하기 전에 데이터를 변환해야 할 수 있습니다. Lambda 함수로 이 태스크를 수행하는 방법에 대한 자세한 내용은 동일한 안내서의 Amazon Kinesis Data Firehose Data 데이터 변환을 참조하세요.

Fluentd

Fluentd OpenSearch 플러그인을 사용하여 인프라, 컨테이너 및 네트워크 장치에서 데이터를 수집하여 서버리스 컬렉션으로 보낼 수 있습니다. OpenSearch Calyptia는 Ruby와 SSL의 모든 다운스트림 종속성을 포함하는 Fluentd 배포를 유지 관리합니다.

Fluentd를 사용하여 서버리스로 데이터를 보내려면 OpenSearch
  1. https://www.fluentd.org/download에서 Calyptia Fluentd 버전 1.4.2 또는 이후 버전을 다운로드합니다. 이 버전에는 기본적으로 OpenSearch 서버리스를 지원하는 플러그인이 포함되어 있습니다. OpenSearch

  2. 패키지를 설치합니다. 운영 체제에 따라 Fluentd 설명서의 지침을 따르세요.

  3. OpenSearch 서버리스로 데이터를 보내는 구성을 추가합니다. 이 샘플 구성은 “test” 메시지를 단일 컬렉션으로 보냅니다. 다음을 수행하세요.

    • 의 경우host, OpenSearch 서버리스 컬렉션의 엔드포인트를 지정하십시오.

    • aws_service_name에서 aoss를 지정합니다.

    <source> @type sample tag test test {"hello":"world"} </source> <match test> @type opensearch host https://collection-endpoint.us-east-1.aoss.amazonaws.com port 443 index_name fluentd aws_service_name aoss </match>
  4. Calyptia Fluentd를 실행하여 컬렉션으로 데이터 전송을 시작합니다. 예를 들어 Mac에서 다음 명령을 실행할 수 있습니다.

    sudo launchctl load /Library/LaunchDaemons/calyptia-fluentd.plist

Go

다음 샘플 코드는 Go용 opensearch-go 클라이언트를 사용하여 지정된 OpenSearch 서버리스 컬렉션에 대한 보안 연결을 설정하고 단일 인덱스를 만듭니다. regionhost의 값을 입력해야 합니다.

package main import ( "context" "log" "strings" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" opensearch "github.com/opensearch-project/opensearch-go/v2" opensearchapi "github.com/opensearch-project/opensearch-go/v2/opensearchapi" requestsigner "github.com/opensearch-project/opensearch-go/v2/signer/awsv2" ) const endpoint = "" // serverless collection endpoint func main() { ctx := context.Background() awsCfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("<AWS_REGION>"), config.WithCredentialsProvider( getCredentialProvider("<AWS_ACCESS_KEY>", "<AWS_SECRET_ACCESS_KEY>", "<AWS_SESSION_TOKEN>"), ), ) if err != nil { log.Fatal(err) // don't log.fatal in a production-ready app } // create an AWS request Signer and load AWS configuration using default config folder or env vars. signer, err := requestsigner.NewSignerWithService(awsCfg, "aoss") // "aoss" for Amazon OpenSearch Serverless if err != nil { log.Fatal(err) // don't log.fatal in a production-ready app } // create an opensearch client and use the request-signer client, err := opensearch.NewClient(opensearch.Config{ Addresses: []string{endpoint}, Signer: signer, }) if err != nil { log.Fatal("client creation err", err) } indexName := "go-test-index" // define index mapping mapping := strings.NewReader(`{ "settings": { "index": { "number_of_shards": 4 } } }`) // create an index createIndex := opensearchapi.IndicesCreateRequest{ Index: indexName, Body: mapping, } createIndexResponse, err := createIndex.Do(context.Background(), client) if err != nil { log.Println("Error ", err.Error()) log.Println("failed to create index ", err) log.Fatal("create response body read err", err) } log.Println(createIndexResponse) // delete the index deleteIndex := opensearchapi.IndicesDeleteRequest{ Index: []string{indexName}, } deleteIndexResponse, err := deleteIndex.Do(context.Background(), client) if err != nil { log.Println("failed to delete index ", err) log.Fatal("delete index response body read err", err) } log.Println("deleting index", deleteIndexResponse) } func getCredentialProvider(accessKey, secretAccessKey, token string) aws.CredentialsProviderFunc { return func(ctx context.Context) (aws.Credentials, error) { c := &aws.Credentials{ AccessKeyID: accessKey, SecretAccessKey: secretAccessKey, SessionToken: token, } return *c, nil } }

Java

다음 샘플 코드는 Java용 opensearch-java 클라이언트를 사용하여 지정된 OpenSearch 서버리스 컬렉션에 대한 보안 연결을 설정하고 단일 인덱스를 만듭니다. regionhost의 값을 입력해야 합니다.

OpenSearch 서비스 도메인과 비교했을 때 중요한 차이점은 서비스 이름 (aoss대신) 입니다. es

// import OpenSearchClient to establish connection to OpenSearch Serverless collection import org.opensearch.client.opensearch.OpenSearchClient; SdkHttpClient httpClient = ApacheHttpClient.builder().build(); // create an opensearch client and use the request-signer OpenSearchClient client = new OpenSearchClient( new AwsSdk2Transport( httpClient, "...us-west-2.aoss.amazonaws.com", // serverless collection endpoint "aoss" // signing service name Region.US_WEST_2, // signing service region AwsSdk2TransportOptions.builder().build() ) ); String index = "sample-index"; // create an index CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(index).build(); CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest); System.out.println("Create index reponse: " + createIndexResponse); // delete the index DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest.Builder().index(index).build(); DeleteIndexResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest); System.out.println("Delete index reponse: " + deleteIndexResponse); httpClient.close();

다음 샘플 코드는 다시 보안 연결을 설정한 다음 색인을 검색합니다.

import org.opensearch.client.opensearch.OpenSearchClient; SdkHttpClient httpClient = ApacheHttpClient.builder().build(); OpenSearchClient client = new OpenSearchClient( new AwsSdk2Transport( httpClient, "...us-west-2.aoss.amazonaws.com", // serverless collection endpoint "aoss" // signing service name Region.US_WEST_2, // signing service region AwsSdk2TransportOptions.builder().build() ) ); Response response = client.generic() .execute( Requests.builder() .endpoint("/" + "users" + "/_search?typed_keys=true") .method("GET") .json("{" + " \"query\": {" + " \"match_all\": {}" + " }" + "}") .build()); httpClient.close();

JavaScript

다음 샘플 코드는 opensearch-js 클라이언트를 사용하여 지정된 OpenSearch 서버리스 컬렉션에 대한 JavaScript 보안 연결을 설정하고, 단일 인덱스를 만들고, 문서를 추가하고, 인덱스를 삭제합니다. noderegion의 값을 입력해야 합니다.

OpenSearch 서비스 도메인과 비교했을 때 중요한 차이점은 서비스 이름 (aoss대신) 입니다. es

Version 3

이 JavaScript 예제에서는 Node.js 용 SDK 버전 3을 사용합니다.

const { defaultProvider } = require('@aws-sdk/credential-provider-node'); const { Client } = require('@opensearch-project/opensearch'); const { AwsSigv4Signer } = require('@opensearch-project/opensearch/aws'); async function main() { // create an opensearch client and use the request-signer const client = new Client({ ...AwsSigv4Signer({ region: 'us-west-2', service: 'aoss', getCredentials: () => { const credentialsProvider = defaultProvider(); return credentialsProvider(); }, }), node: '' # // serverless collection endpoint }); const index = 'movies'; // create index if it doesn't already exist if (!(await client.indices.exists({ index })).body) { console.log((await client.indices.create({ index })).body); } // add a document to the index const document = { foo: 'bar' }; const response = await client.index({ id: '1', index: index, body: document, }); console.log(response.body); // delete the index console.log((await client.indices.delete({ index })).body); } main();
Version 2

이 예제에서는 Node.js 버전의 SDK를 사용합니다 JavaScript .

const AWS = require('aws-sdk'); const { Client } = require('@opensearch-project/opensearch'); const { AwsSigv4Signer } = require('@opensearch-project/opensearch/aws'); async function main() { // create an opensearch client and use the request-signer const client = new Client({ ...AwsSigv4Signer({ region: 'us-west-2', service: 'aoss', getCredentials: () => new Promise((resolve, reject) => { AWS.config.getCredentials((err, credentials) => { if (err) { reject(err); } else { resolve(credentials); } }); }), }), node: '' # // serverless collection endpoint }); const index = 'movies'; // create index if it doesn't already exist if (!(await client.indices.exists({ index })).body) { console.log((await client.indices.create({ index })).body); } // add a document to the index const document = { foo: 'bar' }; const response = await client.index({ id: '1', index: index, body: document, }); console.log(response.body); // delete the index console.log((await client.indices.delete({ index })).body); } main();

Logstash

Logstash OpenSearch 플러그인을 사용하여 서버리스 컬렉션에 로그를 게시할 수 있습니다. OpenSearch

Logstash를 사용하여 서버리스로 데이터를 보내려면 OpenSearch
  1. Docker 또는 Linux를 사용하여 logstash-output-opensearch플러그인 버전 2.0.0 이상을 설치하십시오.

    Docker

    Docker는 출력 플러그인인 opensearchproject/ -output-plugin이 사전 설치된 상태로 Logstash OSS 소프트웨어를 호스팅합니다 OpenSearch . logstash-oss-with-opensearch 다른 이미지와 마찬가지로 이미지를 가져올 수 있습니다.

    docker pull opensearchproject/logstash-oss-with-opensearch-output-plugin:latest
    Linux

    아직 설치하지 않았다면 먼저 최신 버전의 Logstash를 설치합니다. 그런 다음 출력 플러그인 버전 2.0.0을 설치합니다.

    cd logstash-8.5.0/ bin/logstash-plugin install --version 2.0.0 logstash-output-opensearch

    플러그인이 이미 설치되어 있는 경우 최신 버전으로 업데이트합니다.

    bin/logstash-plugin update logstash-output-opensearch

    플러그인 버전 2.0.0부터 SDK는 버전 3을 사용합니다. AWS 8.4.0 이전의 Logstash 버전을 사용하는 경우 사전 설치된 AWS 플러그인을 모두 제거하고 플러그인을 설치해야 합니다. logstash-integration-aws

    /usr/share/logstash/bin/logstash-plugin remove logstash-input-s3 /usr/share/logstash/bin/logstash-plugin remove logstash-input-sqs /usr/share/logstash/bin/logstash-plugin remove logstash-output-s3 /usr/share/logstash/bin/logstash-plugin remove logstash-output-sns /usr/share/logstash/bin/logstash-plugin remove logstash-output-sqs /usr/share/logstash/bin/logstash-plugin remove logstash-output-cloudwatch /usr/share/logstash/bin/logstash-plugin install --version 0.1.0.pre logstash-integration-aws
  2. OpenSearch 출력 플러그인을 OpenSearch 서버리스에서 사용하려면 logstash.conf의 출력 섹션을 다음과 같이 수정해야 합니다. opensearch

    • aossauth_typeservice_name으로 지정합니다.

    • hosts에 대한 컬렉션 엔드포인트를 지정합니다.

    • 파라미터 default_server_major_versionlegacy_template을 추가합니다. 플러그인이 서버리스에서 작동하려면 이러한 매개변수가 필요합니다. OpenSearch

    output { opensearch { hosts => "collection-endpoint:443" auth_type => { ... service_name => 'aoss' } default_server_major_version => 2 legacy_template => false } }

    이 예제 구성 파일은 S3 버킷의 파일에서 입력을 가져와 OpenSearch 서버리스 컬렉션으로 보냅니다.

    input { s3 { bucket => "my-s3-bucket" region => "us-east-1" } } output { opensearch { ecs_compatibility => disabled hosts => "https://my-collection-endpoint.us-east-1.aoss.amazonaws.com:443" index => my-index auth_type => { type => 'aws_iam' aws_access_key_id => 'your-access-key' aws_secret_access_key => 'your-secret-key' region => 'us-east-1' service_name => 'aoss' } default_server_major_version => 2 legacy_template => false } }
  3. 그런 다음 새 구성으로 Logstash를 실행하여 플러그인을 테스트합니다.

    bin/logstash -f config/test-plugin.conf

Python

다음 샘플 코드는 opensearch-py 클라이언트 for Python을 사용하여 지정된 OpenSearch 서버리스 컬렉션에 대한 보안 연결을 설정하고 단일 인덱스를 만든 다음 해당 인덱스를 검색합니다. regionhost의 값을 입력해야 합니다.

OpenSearch 서비스 도메인과 비교했을 때 중요한 차이점은 서비스 이름 (aoss대신) 입니다. es

from opensearchpy import OpenSearch, RequestsHttpConnection, AWSV4SignerAuth import boto3 host = '' # serverless collection endpoint, without https:// region = '' # e.g. us-east-1 service = 'aoss' credentials = boto3.Session().get_credentials() auth = AWSV4SignerAuth(credentials, region, service) # create an opensearch client and use the request-signer client = OpenSearch( hosts=[{'host': host, 'port': 443}], http_auth=auth, use_ssl=True, verify_certs=True, connection_class=RequestsHttpConnection, pool_maxsize=20, ) # create an index index_name = 'books-index' create_response = client.indices.create( index_name ) print('\nCreating index:') print(create_response) # index a document document = { 'title': 'The Green Mile', 'director': 'Stephen King', 'year': '1996' } response = client.index( index = 'books-index', body = document, id = '1' ) # delete the index delete_response = client.indices.delete( index_name ) print('\nDeleting index:') print(delete_response)

Ruby

opensearch-aws-sigv4젬은 OpenSearch 서비스와 함께 OpenSearch 기본적으로 서버리스에 대한 액세스를 제공합니다. 이 gem의 종속 항목이므로 opensearch-ruby 클라이언트의 모든 기능을 가지고 있습니다.

Sigv4 서명자를 인스턴스화할 때 aoss를 서비스 이름으로 지정합니다.

require 'opensearch-aws-sigv4' require 'aws-sigv4' signer = Aws::Sigv4::Signer.new(service: 'aoss', region: 'us-west-2', access_key_id: 'key_id', secret_access_key: 'secret') # create an opensearch client and use the request-signer client = OpenSearch::Aws::Sigv4Client.new( { host: 'https://your.amz-opensearch-serverless.endpoint', log: true }, signer) # create an index index = 'prime' client.indices.create(index: index) # insert data client.index(index: index, id: '1', body: { name: 'Amazon Echo', msrp: '5999', year: 2011 }) # query the index client.search(body: { query: { match: { name: 'Echo' } } }) # delete index entry client.delete(index: index, id: '1') # delete the index client.indices.delete(index: index)

다른 클라이언트로 HTTP 요청 서명

다른 클라이언트와 HTTP 요청을 구성할 때 OpenSearch 서버리스 컬렉션에 요청에 서명할 때는 다음 요구 사항이 적용됩니다.

  • 서비스 이름을 aoss로 지정합니다.

  • x-amz-content-sha256 헤더는 모든 AWS 서명 버전 4 요청에 필요합니다. 요청 페이로드의 해시를 제공합니다. 요청 페이로드가 있는 경우 값을 보안 해시 알고리즘(SHA) 암호화 해시(SHA256)로 설정합니다. 요청 페이로드가 없는 경우 값을 빈 문자열의 해시인 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855(으)로 설정합니다.

CurL을 사용한 인덱싱

다음 예제 요청은 cURL (클라이언트 URL 요청 라이브러리) 을 사용하여 컬렉션 movies-index 내에 이름이 지정된 인덱스로 단일 문서를 보냅니다.

curl -XPOST \ --user "$AWS_ACCESS_KEY_ID":"$AWS_SECRET_ACCESS_KEY" \ --aws-sigv4 "aws:amz:us-east-1:aoss" \ --header "x-amz-content-sha256: $REQUEST_PAYLOAD_SHA_HASH" \ --header "x-amz-security-token: $AWS_SESSION_TOKEN" \ "https://my-collection-endpoint.us-east-1.aoss.amazonaws.com/movies-index/_doc" \ -H "Content-Type: application/json" -d '{"title": "Shawshank Redemption"}'

Postman을 통한 색인 생성

다음 이미지는 Postman을 사용하여 컬렉션에 요청을 보내는 방법을 보여줍니다. 인증 지침은 Postman의 AWS 서명 인증을 통한 인증 워크플로를 참조하십시오.