기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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
플러그인을
참고
서버리스와 통합하려면 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 Indexmy_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 플러그인을
Fluentd를 사용하여 서버리스로 데이터를 보내려면 OpenSearch
-
https://www.fluentd.org/download
에서 Calyptia Fluentd 버전 1.4.2 또는 이후 버전을 다운로드합니다. 이 버전에는 기본적으로 OpenSearch 서버리스를 지원하는 플러그인이 포함되어 있습니다. OpenSearch -
패키지를 설치합니다. 운영 체제에 따라 Fluentd 설명서의 지침을 따르세요.
-
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_namefluentd
aws_service_name aoss </match> -
-
Calyptia Fluentd를 실행하여 컬렉션으로 데이터 전송을 시작합니다. 예를 들어 Mac에서 다음 명령을 실행할 수 있습니다.
sudo launchctl load /Library/LaunchDaemons/calyptia-fluentd.plist
Go
다음 샘플 코드는 Go용 opensearch-goregion
및 host
의 값을 입력해야 합니다.
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-javaregion
및 host
의 값을 입력해야 합니다.
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-jsnode
및 region
의 값을 입력해야 합니다.
OpenSearch 서비스 도메인과 비교했을 때 중요한 차이점은 서비스 이름 (aoss
대신) 입니다. es
Logstash
Logstash OpenSearch 플러그인을
Logstash를 사용하여 서버리스로 데이터를 보내려면 OpenSearch
-
Docker 또는 Linux를 사용하여 logstash-output-opensearch
플러그인 버전 2.0.0 이상을 설치하십시오. -
OpenSearch 출력 플러그인을 OpenSearch 서버리스에서 사용하려면 logstash.conf의 출력 섹션을 다음과 같이 수정해야 합니다.
opensearch
-
aoss
를auth_type
의service_name
으로 지정합니다. -
hosts
에 대한 컬렉션 엔드포인트를 지정합니다. -
파라미터
default_server_major_version
및legacy_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 } } -
-
그런 다음 새 구성으로 Logstash를 실행하여 플러그인을 테스트합니다.
bin/logstash -f config/
test-plugin
.conf
Python
다음 샘플 코드는 opensearch-py 클라이언트 for Python을region
및 host
의 값을 입력해야 합니다.
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 서명 인증을 통한 인증 워크플로를
![](images/ServerlessPostman.png)