はじめに
シリーズの結果を比較し、PoCだけで作成したAWS resourceを依存関係の逆順で削除する。既存記事から引き継いだRaw backup bucket、Iceberg bucket、Glue database/table、Athena workgroup、IAMユーザー/profileは削除対象に含めない。
source /etc/rawlog-s3-backup/common.env
export PRESERVE_RAW_BUCKET="${S3_BUCKET_NAME}"
source /etc/iceberg/aws.env
export PRESERVE_ICEBERG_BUCKET="${ICEBERG_BUCKET}"
export PRESERVE_GLUE_DATABASE="${GLUE_DATABASE}"
export PRESERVE_ATHENA_WORKGROUP="${ATHENA_WORKGROUP}"
export AWS_PROFILE=home-aws-admin
aws sts get-caller-identity --profile "${AWS_PROFILE}"
printf 'PRESERVE_RAW_BUCKET=%s\n' "${PRESERVE_RAW_BUCKET}"
printf 'PRESERVE_ICEBERG_BUCKET=%s\n' "${PRESERVE_ICEBERG_BUCKET}"
移行結果
| 機能 | オンプレ | AWS |
|---|---|---|
| 収集/転送 | rsyslog / Fluentd | オンプレに残す |
| message bus | Kafka 3.7.1、3 broker | Amazon MSK Provisioned |
| raw writer | オンプレKafka Connect S3 Sink | MSK Connect S3 Sink |
| raw storage | HDFS /data/kafka
|
S3 raw/<topic>
|
| batch | Spark 3.5系 | EMR Serverless Spark |
| stream | Flink 2.0.1 | Managed Service for Apache Flink |
| table | Iceberg 1.10.1 on HDFS | Iceberg v2 on S3 |
| catalog | Hive Metastore | AWS Glue Data Catalog |
| query | Trino | Athena Engine v3 |
完了判定
同一期間について次を記録する。
-
syslog/authlogのproducer rateとconsumer lag - raw JSON件数、先頭/末尾event時刻、invalid JSON数
- batch tableの
COUNT(*)、MIN(ts)、MAX(ts) - host、severity、dt、hr別件数
-
syslog_host_1m/authlog_host_1mのminute別件数 - Glue metadata locationとIceberg snapshot
- Flink停止・再開前後のcheckpoint/snapshot
許容差を事前に決め、差がある状態で旧環境を削除しない。
rollback
| 障害 | rollback |
|---|---|
| MSKへ送れない | Fluentdを旧Kafka brokerへ戻す |
| S3 rawが欠損 | オンプレS3 Sinkを再開し、対象offset範囲を再保存する |
| EMR変換が不正 | 対象dtを削除し、修正jobで再実行する |
| Athena結果が不正 | Glue metadataと旧Trino結果を比較する |
| Flinkが不安定 | AWS applicationを止め、旧jobを旧consumer groupから再開する |
検証環境を削除する
削除対象のaccount、region、ARN、bucket名をファイルへ記録してから実行する。
- Fluentdの送信先を戻し、MSKへのproducerを止める
- Managed Service for Apache Flink applicationをsnapshot付きで停止する
- 第7回で作成したmaintenance schedule、Scheduler role、maintenance runtime role、job fileを削除する
- EMR Serverlessのjob終了を待ち、applicationを削除する
- MSK Connect connector、worker configuration、custom pluginを削除する
- Amazon MSK clusterを削除する
- 本シリーズで追加したstreaming tableだけを削除する。既存Glue databaseとbatch tableは残す
- 検証専用artifact bucketに限り、未完了multipart upload、object version、delete markerを削除する
- 検証専用artifact bucketを削除する。Raw/Iceberg/Athena結果bucketは残す
- 検証専用IAM role/policy、Secrets Manager secret、KMS keyを削除する
- NAT Gateway、Elastic IP、VPC endpoint、Security Group、subnet、VPCを削除する
MSK clusterとconnectorは削除完了を待ってからnetworkを消す。削除scriptへPRESERVE_RAW_BUCKET、PRESERVE_ICEBERG_BUCKET、ATHENA_RESULT_BUCKETを渡さず、対象は検証専用resourceのARNと完全一致で指定する。versioning bucketはaws s3 rmだけではversion/delete markerが残る。KMS key削除は待機期間付きscheduleになる。
まず、これまでの手順で取得したIDを明示的に設定し、削除対象を表示する。値が空のままでは先へ進まない。
export AWS_REGION=ap-northeast-1
export FLINK_APPLICATION_NAME=home-log-flink
export EMR_APPLICATION_ID="${EMR_APPLICATION_ID:?set EMR_APPLICATION_ID}"
export MSK_CLUSTER_ARN="${MSK_CLUSTER_ARN:?set MSK_CLUSTER_ARN}"
export ARTIFACT_BUCKET="${ARTIFACT_BUCKET:?set ARTIFACT_BUCKET}"
printf '%s\n' \
"FLINK=${FLINK_APPLICATION_NAME}" \
"EMR=${EMR_APPLICATION_ID}" \
"MSK=${MSK_CLUSTER_ARN}" \
"ARTIFACT=s3://${ARTIFACT_BUCKET}"
test "${ARTIFACT_BUCKET}" != "${PRESERVE_RAW_BUCKET}"
test "${ARTIFACT_BUCKET}" != "${PRESERVE_ICEBERG_BUCKET}"
read -r -p '上記PoC resourceを削除する場合は DELETE と入力: ' ANSWER
test "${ANSWER}" = DELETE || exit 1
Managed Service for Apache Flink、EMR Serverless、MSK Connect、MSKの順に停止・削除する。
FLINK_STATUS=$(aws kinesisanalyticsv2 describe-application \
--region "${AWS_REGION}" --application-name "${FLINK_APPLICATION_NAME}" \
--query ApplicationDetail.ApplicationStatus --output text \
--profile "${AWS_PROFILE}")
if [ "${FLINK_STATUS}" = RUNNING ]; then
aws kinesisanalyticsv2 stop-application \
--region "${AWS_REGION}" --application-name "${FLINK_APPLICATION_NAME}" \
--profile "${AWS_PROFILE}"
fi
while [ "$(aws kinesisanalyticsv2 describe-application \
--region "${AWS_REGION}" --application-name "${FLINK_APPLICATION_NAME}" \
--query ApplicationDetail.ApplicationStatus --output text \
--profile "${AWS_PROFILE}")" != READY ]; do sleep 20; done
FLINK_CREATE_TS=$(aws kinesisanalyticsv2 describe-application \
--region "${AWS_REGION}" --application-name "${FLINK_APPLICATION_NAME}" \
--query ApplicationDetail.CreateTimestamp --output text \
--profile "${AWS_PROFILE}")
aws kinesisanalyticsv2 delete-application \
--region "${AWS_REGION}" --application-name "${FLINK_APPLICATION_NAME}" \
--create-timestamp "${FLINK_CREATE_TS}" --profile "${AWS_PROFILE}"
aws emr-serverless delete-application \
--region "${AWS_REGION}" --application-id "${EMR_APPLICATION_ID}" \
--profile "${AWS_PROFILE}"
aws kafkaconnect list-connectors --region "${AWS_REGION}" \
--query 'connectors[?starts_with(connectorName, `home-log-`)].connectorArn' \
--output text --profile "${AWS_PROFILE}" | tr '\t' '\n' |
while read -r CONNECTOR_ARN; do
[ -n "${CONNECTOR_ARN}" ] && aws kafkaconnect delete-connector \
--region "${AWS_REGION}" --connector-arn "${CONNECTOR_ARN}" \
--profile "${AWS_PROFILE}"
done
while aws kafkaconnect list-connectors --region "${AWS_REGION}" \
--query 'connectors[?starts_with(connectorName, `home-log-`)]' \
--output text --profile "${AWS_PROFILE}" | grep -q .; do sleep 20; done
aws kafka delete-cluster --region "${AWS_REGION}" \
--cluster-arn "${MSK_CLUSTER_ARN}" --profile "${AWS_PROFILE}"
MSKが一覧から消えた後で、artifact bucketと認証resourceを削除する。以下はversioningを有効化していないartifact bucket用である。versioning済みなら[create]hdfsex8-aws-test-environment-cleanup.mdのversion/delete marker削除手順を使う。
while aws kafka describe-cluster-v2 --region "${AWS_REGION}" \
--cluster-arn "${MSK_CLUSTER_ARN}" --profile "${AWS_PROFILE}" \
>/dev/null 2>&1; do sleep 30; done
aws s3 rm "s3://${ARTIFACT_BUCKET}/" --recursive --profile "${AWS_PROFILE}"
aws s3api delete-bucket --region "${AWS_REGION}" \
--bucket "${ARTIFACT_BUCKET}" --profile "${AWS_PROFILE}"
aws secretsmanager delete-secret --region "${AWS_REGION}" \
--secret-id "${MSK_SECRET_ARN}" --recovery-window-in-days 7 \
--profile "${AWS_PROFILE}"
aws kms schedule-key-deletion --region "${AWS_REGION}" \
--key-id "${KMS_KEY_ID}" --pending-window-in-days 7 \
--profile "${AWS_PROFILE}"
IAM role、log group、Security Group、subnet、route table、Internet Gateway、VPCは、attachmentとnetwork interfaceが0件であることをlist-attached-role-policies、describe-network-interfacesで確認してから、第1回で記録したIDを指定して削除する。既存VPCを使った場合はVPC自体を削除しない。
削除確認
aws kafka list-clusters-v2 --region "$AWS_REGION" --profile "${AWS_PROFILE}"
aws kafkaconnect list-connectors --region "$AWS_REGION" --profile "${AWS_PROFILE}"
aws emr-serverless list-applications --region "$AWS_REGION" --profile "${AWS_PROFILE}"
aws glue get-database --region "$AWS_REGION" --name "${PRESERVE_GLUE_DATABASE}" --profile home-aws
aws s3api head-bucket --bucket "${PRESERVE_RAW_BUCKET}" --profile home-rawlog-backup
aws s3api head-bucket --bucket "${PRESERVE_ICEBERG_BUCKET}" --profile home-aws
START_DATE=$(date -u -v-7d +%Y-%m-%d)
END_DATE=$(date -u +%Y-%m-%d)
aws ce get-cost-and-usage --time-period Start="${START_DATE}",End="${END_DATE}" \
--granularity DAILY --metrics UnblendedCost \
--group-by Type=DIMENSION,Key=SERVICE \
--profile "${AWS_PROFILE}"
LinuxではSTART_DATE=$(date -u -d '7 days ago' +%Y-%m-%d)を使用する。
Cost Explorerには反映遅延がある。翌日以降もMSK、NAT Gateway、Flink、MSK Connect、CloudWatch Logs、S3の課金を確認する。
まとめ
本シリーズではKafka中心という既存思想を残し、境界より後ろをMSK、MSK Connect、S3、EMR Serverless、Managed Service for Apache Flink、Glue、Athenaへ置き換えた。SparkのbatchとFlinkのstreamingは分離したままである。
移行完了はAWSへdataが1件届いた時点ではない。新旧の件数と時刻を比較し、再実行、checkpoint復旧、rollback、費用、削除まで確認できた状態を完了とする。
関連記事
- 【導入編】オンプレのログ分析基盤をAWSマネージドサービスへ移行する全体設計
- 【第6回】Flink 2.0.1のログ処理をManaged Service for Apache Flinkへ移行する
- 【第7回】EMR ServerlessとEventBridge SchedulerでIcebergメンテナンスを定期実行する
実機検証について
本稿は未検証のcleanup checklistである。削除は不可逆なため、対象ARNとbackupを再確認し、PoC専用resourceに限って実行する。