Amazon Data Firehose로 테이블에 데이터 스트리밍하기

Amazon Data Firehose로 테이블에 데이터 스트리밍하기 (Streaming data to tables with Amazon Data Firehose)

Amazon Data Firehose는 실시간 스트리밍 데이터를 Amazon S3, Amazon Redshift, Amazon OpenSearch Service, Splunk, Apache Iceberg 테이블, 커스텀 HTTP 엔드포인트 또는 지원되는 서드파티 서비스 제공자의 HTTP 엔드포인트 같은 대상으로 전달하는 완전 관리형 서비스예요. Amazon Data Firehose를 사용하면 애플리케이션을 작성하거나 리소스를 관리할 필요가 없어요. 데이터 생산자를 Firehose로 데이터를 보내도록 구성하면 Firehose가 지정한 대상으로 데이터를 자동 전달해요. 전달하기 전에 데이터를 변환하도록 Firehose를 구성할 수도 있어요. Amazon Data Firehose에 대해 자세히 알아보려면 "What is Amazon Data Firehose?" 문서를 참고하세요.

출처: 문서

본문

S3 테이블 버킷의 테이블로 Firehose 스트리밍을 설정하려면 다음 단계를 완료해요.

  • 테이블 버킷을 AWS 분석 서비스와 통합해요.
  • Firehose가 S3 테이블에 데이터를 전달하도록 구성해요. 이렇게 하려면 Firehose가 테이블에 접근할 수 있게 해주는 AWS Identity and Access Management(IAM) 서비스 역할을 만들어요.
  • Firehose 서비스 역할에 테이블이나 테이블의 네임스페이스에 대한 명시적 권한을 부여해요. 자세한 내용은 "Grant necessary permissions" 문서를 참고하세요.
  • 데이터를 테이블로 라우팅하는 Firehose 스트림을 만들어요.

Firehose가 S3 테이블을 대상으로 사용하도록 역할 만들기

Firehose는 AWS Glue 테이블에 접근하고 S3 테이블에 데이터를 쓰기 위해 특정 권한이 있는 IAM 서비스 역할이 필요해요. Firehose 스트림을 만들 때 이 IAM 역할을 제공해야 해요.

  1. https://console.aws.amazon.com/iam/ 에서 IAM 콘솔을 열어요.
  2. 왼쪽 탐색 창에서 Policies를 선택해요.
  3. Create a policy를 선택하고 정책 편집기에서 JSON을 선택해요.
  4. 데이터 카탈로그의 모든 데이터베이스와 테이블에 권한을 부여하는 다음 인라인 정책을 추가해요. 원하면 특정 테이블과 데이터베이스에만 권한을 줄 수도 있어요. 이 정책을 사용하려면 사용자 입력 자리표시자를 자신의 정보로 바꾸세요.
    { "Version":"2012-10-17",
        "Statement": [
            { "Sid": "S3TableAccessViaGlueFederation",
                "Effect": "Allow",
                "Action": [
                    "glue:GetTable",
                    "glue:GetDatabase",
                    "glue:UpdateTable"
                ],
                "Resource": [
                    "arn:aws:glue:us-east-1:111122223333:catalog/s3tablescatalog/*",
                    "arn:aws:glue:us-east-1:111122223333:catalog/s3tablescatalog",
                    "arn:aws:glue:us-east-1:111122223333:catalog",
                    "arn:aws:glue:us-east-1:111122223333:database/*",
                    "arn:aws:glue:us-east-1:111122223333:table/*/*"
                ]
            },
            { "Sid": "S3DeliveryErrorBucketPermission",
                "Effect": "Allow",
                "Action": [
                    "s3:AbortMultipartUpload",
                    "s3:GetBucketLocation",
                    "s3:GetObject",
                    "s3:ListBucket",
                    "s3:ListBucketMultipartUploads",
                    "s3:PutObject"
                ],
                "Resource": [
                    "arn:aws:s3:::error-delivery-bucket",
                    "arn:aws:s3:::error-delivery-bucket/*"
                ]
            },
            { "Sid": "RequiredWhenUsingKinesisDataStreamsAsSource",
                "Effect": "Allow",
                "Action": [
                    "kinesis:DescribeStream",
                    "kinesis:GetShardIterator",
                    "kinesis:GetRecords",
                    "kinesis:ListShards"
                ],
                "Resource": "arn:aws:kinesis:us-east-1:111122223333:stream/stream-name"
            },
            { "Sid": "RequiredWhenDoingMetadataReadsANDDataAndMetadataWriteViaLakeformation",
                "Effect": "Allow",
                "Action": [
                    "lakeformation:GetDataAccess"
                ],
                "Resource": "*"
            },
            { "Sid": "RequiredWhenUsingKMSEncryptionForS3ErrorBucketDelivery",
                "Effect": "Allow",
                "Action": [
                    "kms:Decrypt",
                    "kms:GenerateDataKey"
                ],
                "Resource": [
                    "arn:aws:kms:us-east-1:111122223333:key/KMS-key-id"
                ],
                "Condition": { "StringEquals": { "kms:ViaService": "s3.us-east-1.amazonaws.com" },
                    "StringLike": { "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::error-delivery-bucket/prefix*" }
                }
            },
            { "Sid": "LoggingInCloudWatch",
                "Effect": "Allow",
                "Action": [
                    "logs:PutLogEvents"
                ],
                "Resource": [
                    "arn:aws:logs:us-east-1:111122223333:log-group:log-group-name:log-stream:log-stream-name"
                ]
            },
            { "Sid": "RequiredWhenAttachingLambdaToFirehose",
                "Effect": "Allow",
                "Action": [
                    "lambda:InvokeFunction",
                    "lambda:GetFunctionConfiguration"
                ],
                "Resource": [
                    "arn:aws:lambda:us-east-1:111122223333:function:function-name:function-version"
                ]
            }
        ]
    }
    
    이 정책에는 Kinesis Data Streams에 접근하고, Lambda 함수를 호출하고, AWS KMS 키에 접근하는 것을 허용하는 문이 있어요. 이런 리소스를 사용하지 않는다면 해당 문을 제거해도 돼요. 오류 로깅을 켜면 Firehose도 데이터 전달 오류를 CloudWatch 로그 그룹과 스트림으로 보내요. 이를 위해 로그 그룹과 로그 스트림 이름을 구성해야 해요. 로그 그룹·로그 스트림 이름은 "Monitor Amazon Data Firehose Using CloudWatch Logs" 문서를 참고하세요.
  5. 정책을 만든 뒤 Trusted entity type으로 AWS service를 사용해 IAM 역할을 만들어요.
  6. Service or use case에서 Kinesis를 선택하고, Use case에서 Kinesis Firehose를 선택해요.
  7. Next를 선택한 다음 앞에서 만든 정책을 선택해요.
  8. 역할에 이름을 지정해요. 역할 세부 정보를 검토하고 Create role을 선택해요. 역할은 다음 신뢰 정책을 갖게 돼요.
    { "Version":"2012-10-17",
        "Statement": [
            { "Effect": "Allow",
                "Action": [
                    "sts:AssumeRole"
                ],
                "Principal": { "Service": [
                        "firehose.amazonaws.com"
                    ]
                }
            }
        ]
    }
    

S3 테이블로 Firehose 스트림 만들기

다음 절차는 콘솔을 사용해 S3 테이블로 데이터를 전달하는 Firehose 스트림을 만드는 방법을 보여줘요. S3 테이블로 Firehose 스트림을 설정하려면 다음 사전 조건이 필요해요.

사전 조건

  • 테이블 버킷을 AWS 분석 서비스와 통합해요.
  • 네임스페이스를 만들어요.
  • 테이블을 만들어요.
  • Firehose가 S3 Tables에 접근하는 역할을 만들어요.
  • 만든 Firehose 서비스 역할에 테이블에 접근하는 데 필요한 권한을 부여해요.

Firehose 스트림을 구성할 때 라우팅 정보를 제공하려면 데이터베이스 이름으로 네임스페이스를, 그 네임스페이스의 테이블 이름을 사용해요. 이 값들을 Firehose 스트림 구성의 Unique key 섹션에서 사용해 데이터를 단일 테이블로 라우팅할 수 있어요. 이 값들을 사용해 JSON Query 표현식으로 테이블로 라우팅할 수도 있어요. 자세한 내용은 "Route incoming records to a single Iceberg table" 문서를 참고하세요.

S3 테이블로 Firehose 스트림을 설정하려면(콘솔):

  1. https://console.aws.amazon.com/firehose/ 에서 Firehose 콘솔을 열어요.
  2. Create Firehose stream을 선택해요.
  3. Source에서 다음 소스 중 하나를 선택해요. Amazon Kinesis Data Streams / Amazon MSK / Direct PUT
  4. Destination에서 Apache Iceberg Tables를 선택해요.
  5. Firehose 스트림 이름을 입력해요.
  6. 소스 설정을 구성해요.
  7. Destination settings에서 계정의 테이블로 스트리밍하려면 Current account를, 다른 계정의 테이블에는 Cross-account를 선택해요. Current account의 테이블에는 Catalog 드롭다운에서 S3 Tables 카탈로그를 선택해요. Cross-account의 테이블에는 다른 계정으로 스트리밍하려는 카탈로그의 ARN을 Catalog ARN에 입력해요.
  8. Unique Key 구성, JSONQuery 표현식, 또는 Lambda 함수를 사용해 데이터베이스와 테이블 이름을 구성해요. 자세한 내용은 Amazon Data Firehose Developer Guide의 "Route incoming records to a single Iceberg table"과 "Route incoming records to different Iceberg tables" 문서를 참고하세요.
  9. Backup settings 아래에서 S3 백업 버킷을 지정해요.
  10. Advanced settings 아래의 Existing IAM roles에서 Firehose를 위해 만든 IAM 역할을 선택해요.
  11. Create Firehose stream을 선택해요.

스트림에 구성할 수 있는 다른 설정에 대한 자세한 내용은 Amazon Data Firehose Developer Guide의 "Set up the Firehose stream" 문서를 참고하세요.

더 알아보기 (Learn more)

  • Quick (Quick)
  • AWS Glue ETL (AWS Glue ETL)