S3 호환

S3 호환 (S3-compatible)

S3 확장

이 확장으로 두 가지 작업을 할 수 있어요.

  • S3에 저장된 파일에서 데이터 수집
  • S3 딥 스토리지에 세그먼트 쓰기

이 Apache Druid 확장을 사용하려면 druid-s3-extensions를 확장 로드 목록에 포함하세요.

출처: 문서

본문

S3에서 데이터 읽기

S3 input source를 가진 네이티브 배치 Parallel 태스크를 사용해서 S3에서 객체를 직접 읽을 수 있어요. S3에서 객체를 읽으려면 구성(configuration)에 연결 정보를 제공해야 합니다.

딥 스토리지 (Deep Storage)

S3 호환 딥 스토리지는 Amazon S3 또는 S3와 동일한 API를 노출하는 Google Storage 같은 호환 서비스를 의미해요.

S3 딥 스토리지는 druid.storage.type=s3로 설정해야 명시적으로 활성화됩니다. 스토리지 타입을 S3로 설정한 뒤에야 아래 설정들이 적용됩니다.

S3를 딥 스토리지로 사용하려면 구성에 연결 정보를 제공하고, 딥 스토리지에 특화된 추가 설정을 해야 해요.

딥 스토리지 전용 설정

| Property | Description | Default | | druid.storage.bucket | 저장할 버킷 | 반드시 설정. | | druid.storage.baseKey | S3 딥 스토리지에 게시되는 세그먼트의 객체 이름 앞에 붙을 접두사 문자열 | 반드시 설정. | | druid.storage.type | 전역 딥 스토리지 제공자. 이 확장을 사용하려면 s3로 설정해야 함 | 반드시 설정(보통 s3). | | druid.storage.disableAcl | 객체 권한 처리 방식을 결정하는 Boolean 플래그. ACL을 쓰려면 false로, Object Ownership을 쓰려면 true로 설정. ACL과 Object Ownership의 권한 요구사항은 다르니 S3 permissions settings를 참고. | false | | druid.storage.zip | true, false | s3의 세그먼트를 디렉토리로 쓸지(false) zip 파일로 쓸지(true) | | druid.storage.transfer.useTransferManager | true면 AWS S3 Transfer Manager를 사용해 세그먼트를 S3에 업로드 | true | | druid.storage.transfer.minimumUploadPartSize | 멀티파트 업로드에서 각 파트의 최소 크기(바이트) | 20971520 (20 MB) | | druid.storage.transfer.multipartUploadThreshold | 파일 업로드가 단일 PUT 요청 대신 멀티파트 업로드로 전환되는 파일 크기 임계값(바이트) | 20971520 (20 MB) | | druid.storage.transfer.asyncHttpClientType | S3 Transfer Manager가 사용하는 비동기 HTTP 클라이언트 구현. 허용값: crt(Amazon CRT) 또는 netty(Netty NIO) | crt |

구성 (Configuration)

S3 인증 방법

딥 스토리지든 수집 소스든, S3에 연결하기 위한 자격 증명(credentials)을 여러 방법으로 제공할 수 있어요.

설정 옵션은 우선순위 순서대로 나열됩니다. 예를 들어 ~/.aws/credentials에 있는 프로필 정보를 사용하고 싶다면, Druid 구성 파일에 druid.s3.accessKey와 druid.s3.secretKey를 설정하지 마세요. 그 값들이 우선권을 가지기 때문입니다.

| order | type | details | | 1 | Druid config file | druid.s3.accessKey와 druid.s3.secretKey 값을 담은 runtime.properties 기반 | | 2 | Custom properties file | sessionToken, accessKey, secretKey 값을 제공하는 커스텀 properties 파일 기반. 이 파일은 druid.s3.fileSessionCredentials 속성으로 Druid에 제공 | | 3 | Environment variables | 환경 변수 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY 기반 | | 4 | Java system properties | JVM 속성 aws.accessKeyId와 aws.secretKey 기반 | | 5 | Profile information | druid 인스턴스에 있는 자격 증명(보통 ~/.aws/credentials) 기반 | | 6 | ECS container credentials | EC2ContainerCredentialsProviderWrapper 문서에 기술된 대로 AWS ECS에서 사용 가능한 환경 변수(AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 또는 AWS_CONTAINER_CREDENTIALS_FULL_URI) 기반 | | 7 | Instance profile information | druid 인스턴스에 연결된 인스턴스 프로필 기반 |

더 자세한 내용은 Amazon Developer Guide를 참고하세요.

또는 수집 스펙 안의 Properties Object로 액세스 키와 시크릿 키를 지정해서 이 체인을 우회할 수 있습니다.

Druid 로그에서 자격 증명 정보를 마스킹하려면 druid.startup.logging.maskProperties 속성을 사용하세요. 예를 들면 ["password", "secretKey", "awsSecretAccessKey"]처럼요.

S3 권한 설정

S3 버킷의 객체 권한을 관리하려면 ACL 또는 Object Ownership을 사용할 수 있어요. 각 방법에 필요한 권한은 다릅니다.

기본적으로 Druid는 ACL을 사용해요. ACL을 사용하면 Druid가 버킷에 넣는 모든 객체가 버킷의 ACL 설정을 상속합니다.

druid.storage.disableAcl을 true로 설정하면 ACL 대신 Object Ownership을 사용하도록 전환할 수 있어요. 생성되는 모든 객체를 버킷 소유자가 소유하므로, 권한 관리를 위해 S3의 버킷 정책을 사용해야 합니다.

참고로 이 설정은 Druid의 동작에만 영향을 줍니다. S3에서 Object Ownership을 사용하도록 변경하려면 추가 구성이 필요해요. 자세한 내용은 AWS 문서의 Controlling ownership of objects and disabling ACLs for your bucket을 참고하세요.

ACL 권한

ACL을 사용한다면 Druid에게 다음 권한이 필요해요.

  • s3:GetObject
  • s3:PutObject
  • s3:DeleteObject
  • s3:GetBucketAcl
  • s3:PutObjectAcl

Object Ownership 권한

Object Ownership을 사용한다면 Druid에게 다음 권한이 필요해요.

  • s3:GetObject
  • s3:PutObject
  • s3:DeleteObject

AWS 리전

AWS SDK는 대상 리전이 지정돼야 해요. JVM 시스템 속성 aws.region이나 환경 변수 AWS_REGION으로 설정할 수 있습니다.

예를 들어 시스템 속성으로 리전을 'us-east-1'로 설정하려면:

  • 모든 Druid 서비스의 jvm.config 파일에 -Daws.region=us-east-1을 추가하세요.
  • Middle Manager 설정의 druid.indexer.runner.javaOptsArray에 "-Daws.region=us-east-1"을 추가해서 그 속성이 Peon(worker) 프로세스에 전달되도록 하세요.

S3 연결 설정

| Property | Description | Default | | druid.s3.accessKey | S3 액세스 키. 자세한 내용은 S3 authentication methods 참고 | 선택한 인증 방법에 따라 생략 가능 | | druid.s3.secretKey | S3 시크릿 키. 자세한 내용은 S3 authentication methods 참고 | 선택한 인증 방법에 따라 생략 가능 | | druid.s3.fileSessionCredentials | sessionToken, accessKey, secretKey 값을 담은 properties 파일 경로. 한 줄당 하나의 key/value 쌍(key=value 형식). 자세한 내용은 S3 authentication methods 참고 | 선택한 인증 방법에 따라 생략 가능 | | druid.s3.protocol | AWS에 요청을 보낼 때 사용할 통신 프로토콜 타입. http 또는 https 사용 가능. druid.s3.endpoint.url이 다른 프로토콜의 URL로 채워져 있으면 이 설정은 무시됨 | https | | druid.s3.disableChunkedEncoding | 청크 인코딩 비활성화. 자세한 내용은 AWS document 참고 | false | | druid.s3.enablePathStyleAccess | 경로 스타일 액세스 활성화. 자세한 내용은 AWS document 참고 | false | | druid.s3.crossRegionAccessEnabled | S3 요청에 대한 크로스 리전 액세스 활성화. 활성화하면 첫 액세스 시 S3 클라이언트가 버킷의 올바른 리전을 자동 감지하고 이후 요청에 캐시함 | false | | druid.s3.forceGlobalBucketAccessEnabled | Deprecated. 대신 druid.s3.crossRegionAccessEnabled 사용. crossRegionAccessEnabled가 명시적으로 설정되지 않은 경우에만 폴백으로 사용 | null | | druid.s3.endpoint.url | 프로토콜 포함 여부와 무관한 서비스 엔드포인트 | None | | druid.s3.endpoint.signingRegion | 요청의 SigV4 서명에 사용할 리전(예: us-west-1) | None | | druid.s3.proxy.host | 연결할 프록시 호스트 | None | | druid.s3.proxy.port | 프록시 호스트의 포트 | None | | druid.s3.proxy.username | 프록시로 연결할 때 사용할 사용자 이름 | None | | druid.s3.proxy.password | 프록시로 연결할 때 사용할 비밀번호 | None | | druid.storage.sse.type | 서버 측 암호화 타입. s3, kms, custom 중 하나여야 함. 자세한 내용은 아래 Server-side encryption 섹션 참고 | None | | druid.storage.sse.kms.keyId | AWS KMS 키 ID. druid.storage.sse.type이 kms일 때만 사용되며 비워두면 기본 키 ID 사용 | None | | druid.storage.sse.custom.base64EncodedKey | Base64로 인코딩된 키. druid.storage.sse.type이 custom이면 지정해야 함 | None |

서버 측 암호화 (Server-side encryption)

druid.storage.sse.type을 지원되는 서버 측 암호화 타입으로 설정하면 서버 측 암호화를 활성화할 수 있어요. 현재 지원되는 타입은:

  • s3: S3 관리형 암호화 키로 서버 측 암호화
  • kms: AWS KMS 관리형 키로 서버 측 암호화
  • custom: 고객 제공 암호화 키(Customer-Provided Encryption Keys)로 서버 측 암호화

더 알아보기 (Learn more)