はじめに
自宅環境では、rsyslogとFluentdでsyslog/auth.logを集め、Kafkaを中心にHDFS、Spark、Flink、Iceberg、Hive Metastore、Trinoへ接続している。
先行する「HDFSログ分析基盤をAWS S3へ段階移行する」シリーズでは、rawログ、Iceberg、checkpoint、catalog、query、運用処理をAmazon S3とAWS Glue Data Catalogへ切り替え、HDFSを停止・撤去した。
本シリーズでは、そのS3/Glue data基盤を作り直さず、オンプレで稼働しているKafka、Kafka Connect、Spark、Flink、TrinoをAWSマネージドサービスへ移行する。
本シリーズを開始する前に、先行シリーズの第1〜7編を完了する。S3、Glue、IAMを削除する第8編のcleanupはスキップする。
「HDFSログ分析基盤をAWS S3へ段階移行する」シリーズから続ける場合は、次の状態を開始条件とする。
- S3にrawログの履歴が存在する
- S3上にbatch用Iceberg tableが存在する
- AWS Glue Data Catalogの
logsdatabaseからtableを参照できる - Athenaで件数と時刻範囲を確認できる
- オンプレKafka ConnectがAmazon S3へrawログを継続保存している
- オンプレSparkがS3 rawを読み、S3 Icebergへ書き込んでいる
- オンプレFlinkがS3 checkpointを使用し、S3 Icebergへ書き込んでいる
- Trino、Grafana、ZeppelinがGlueとS3を参照している
- HDFSが停止・撤去済みである
現在の構成
既存記事から確認した基準構成は次のとおりである。
| 項目 | 現在値 |
|---|---|
| Kafka | 3.7.1、KRaft、controller 3台、broker 3台 |
| topic |
syslog、authlog、各3 partition/replication factor 3 |
| Kafka Connect | 2台、S3 Sink、JSON、1時間directory、Asia/Tokyo |
| raw | Amazon S3のraw/syslog、raw/authlog
|
| Spark | 3.5系、/usr/local/bin/spark-sql-iceberg、日次batch |
| Flink | 2.0.1、S3 checkpoint 5分、EXACTLY_ONCE |
| Iceberg | 1.10.1、format-version 2、GlueCatalog、Amazon S3 |
| batch table |
logs.syslog_iceberg、logs.authlog_iceberg
|
| stream table |
syslog_events、authlog_events、syslog_host_1m、authlog_host_1m
|
| query | Trino経由でGrafana/Zeppelinから参照 |
Sparkはrawログの日次変換、FlinkはKafkaからのstreaming処理を担当する。この役割はAWS側でも変えない。
AWSとの境界
FluentdからS3へ直接送らず、Amazon MSKを分岐点として維持する。
サービス対応表
| オンプレ | AWS | 移行方針 |
|---|---|---|
| rsyslog / Fluentd | 変更なし | 自宅側に残す |
| Kafka broker | Amazon MSK Provisioned | topic名とpartition数を維持 |
| Kafka Connect S3 Sink | MSK Connect + Confluent S3 Sink | 既存prefixへの保存を引き継ぐ |
| Amazon S3 raw | 変更なし | 履歴は再コピーせず、raw/syslog、raw/authlogへMSK Connectの新規分を追加 |
| Spark 3.5系 | EMR Serverless Spark | 日次batchをPySparkへ移植 |
| Flink 2.0.1 | Managed Service for Apache Flink | 対応runtimeへbuildし直す |
| Iceberg/S3 | 変更なし | 既存の履歴、schema、partitionを引き継ぐ |
| AWS Glue Data Catalog | 変更なし | 既存のlogs databaseを引き継ぐ |
| Trino | Amazon Athena Engine v3 | 検証queryを移植 |
共通の名前
Rawバックアップ記事の/etc/rawlog-s3-backup/common.envと、Iceberg構築記事の/etc/iceberg/aws.envを引き継ぐ。通常のデータ確認では、Rawにhome-rawlog-backup、Icebergにhome-awsを使用する。bucket、Glue、Athenaなどの管理操作に限りhome-aws-adminへ切り替える。
export AWS_REGION=ap-northeast-1
source /etc/rawlog-s3-backup/common.env
export RAW_BUCKET="${S3_BUCKET_NAME}"
source /etc/iceberg/aws.env
export LAKE_BUCKET="${ICEBERG_BUCKET}"
export GLUE_DATABASE="${GLUE_DATABASE:-logs}"
export AWS_RAW_PROFILE=home-rawlog-backup
export AWS_SYNC_PROFILE=home-aws
export AWS_ADMIN_PROFILE=home-aws-admin
aws sts get-caller-identity --profile "${AWS_RAW_PROFILE}"
aws sts get-caller-identity --profile "${AWS_SYNC_PROFILE}"
# S3 bucket名は全accountで一意にする。
AWS_ACCOUNT_ID=$(aws sts get-caller-identity \
--query Account --output text --profile "${AWS_ADMIN_PROFILE}")
export ARTIFACT_BUCKET="home-log-artifacts-${AWS_ACCOUNT_ID}-${AWS_REGION}"
aws s3api create-bucket \
--bucket "${ARTIFACT_BUCKET}" \
--region "${AWS_REGION}" \
--create-bucket-configuration LocationConstraint="${AWS_REGION}" \
--profile "${AWS_ADMIN_PROFILE}"
aws s3api put-public-access-block \
--bucket "${ARTIFACT_BUCKET}" \
--public-access-block-configuration \
'BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true' \
--profile "${AWS_ADMIN_PROFILE}"
aws s3api put-bucket-encryption \
--bucket "${ARTIFACT_BUCKET}" \
--server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}' \
--profile "${AWS_ADMIN_PROFILE}"
ARTIFACT_BUCKETだけはjob JARやconnector pluginを置くための検証用bucketとして別途用意する。既存のRaw/Iceberg bucketをartifact置き場として兼用しない。
AWS CLIの--profileは操作端末でのみ使う。MSK Connect、EMR Serverless、Managed Service for Apache FlinkからS3やGlueへ接続するときは、ローカルのprofileを配布せず、各サービスの実行IAM roleへ同等の最小権限を付与する。
S3は次のprefixへ固定する。
s3://${RAW_BUCKET}/raw/syslog/YYYY/MM/dd/HH/
s3://${RAW_BUCKET}/raw/authlog/YYYY/MM/dd/HH/
s3://${LAKE_BUCKET}/warehouse/logs/${TABLE}/
s3://${LAKE_BUCKET}/flink/checkpoints/
s3://${LAKE_BUCKET}/flink/savepoints/
IAMとnetworkの基本設計
実際のVPC、3 AZ subnet、route、Security Groupの作成commandは第1回に掲載する。後続記事では第1回で出力したVPC_ID、SUBNET_ID_1〜SUBNET_ID_3、MSK_SECURITY_GROUP_IDを再利用する。
- MSK broker、MSK Connect、EMR Serverless、Managed Service for Apache Flinkはprivate subnetへ置く
- serviceごとにIAM roleを分け、S3 prefixとGlue actionを絞る
- S3 Gateway Endpoint、必要に応じてGlue/CloudWatch/STSのVPC endpointを用意する
- S3 Block Public Accessとdefault encryptionを有効にする
- secretはSecrets Managerを使い、記事やFluentd設定へ平文で書かない
- オンプレ接続は本番ではSite-to-Site VPN、Direct Connect等を優先する
個人PoCではMSK ProvisionedのPublic accessとSASL/SCRAMを使える。ただしTLS、認証、接続元global IPのSecurity Group制限を必須とし、検証後に閉じる。
移行順序
- 「HDFSログ分析基盤をAWS S3へ段階移行する」第1〜7編を完了し、第8編のcleanupをスキップする
- Amazon MSKを構築し、Fluentdを一時的に新旧Kafkaへ切り替えて疎通を確認する
- 既存S3 rawの最新prefixを確認し、その続きへMSK Connectでraw保存を開始する
- EMR Serverlessで既存S3 rawを読み、既存batch Icebergとの比較後に新規日付分を生成する
- 既存Glue Data Catalogのtableとmetadata locationを確認する
- 既存Athena workgroupで件数、時刻範囲、日付別集計を比較する
- Flink jobをManaged Service for Apache Flinkへ移植する
- 観察期間後、置き換え済みのオンプレKafka、Kafka Connect、Spark、Flink、Trinoを停止する
費用上の注意
特にAmazon MSK Provisionedのbroker、NAT Gateway、Managed Service for Apache Flinkの常時稼働、MSK Connect workerは、データが少なくても時間課金が継続する。S3 request、CloudWatch Logs、Athena scan、cross-AZ通信も確認する。
PoCは作成日時、削除予定日、ownerをtagへ付け、各記事の終了時に不要resourceを停止する。MSKは停止できないため、不要ならclusterを削除する。
本シリーズ
- 本記事: オンプレのログ分析基盤をAWSマネージドサービスへ移行する全体設計
- Amazon MSKへKafkaを移行する
- MSK ConnectでS3へraw保存する
- Spark batchをEMR Serverlessへ移行する
- バックアップ済みIcebergとGlue Data Catalogを引き継ぐ
- Trino分析をAthenaへ移行する
- FlinkをManaged Service for Apache Flinkへ移行する
- 【第7回】EMR ServerlessとEventBridge SchedulerでIcebergメンテナンスを定期実行する
- AWS移行結果を確認して検証環境を削除する
完了条件
- FluentdからMSKの両topicへ継続送信できる
- 既存S3 rawの履歴を保持したまま、切り替え後のobjectが追加される
- 既存batch Icebergを破壊せず、新規日付分とstreaming Icebergが更新される
- Glueが全Iceberg tableの最新metadataを指す
- Athenaの件数と時刻範囲が移行元と一致する
- checkpointからFlink applicationを再開できる
- credential、Public access、課金resourceを棚卸しできる
参考資料
- Amazon MSK client access
- EMR ServerlessでIcebergを使用する
- AthenaでIcebergをqueryする
- Managed Service for Apache Flink
実機検証について
本シリーズは構築前の手順書であり、執筆時点では一連の実機検証を完了していない。AWS Consoleに表示されるversion、料金、quotaを実施時に再確認し、まず検証accountで実行する。
