0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【最終回】AWSマネージドサービス移行結果を確認して検証環境を削除する

0
Last updated at Posted at 2026-09-20

はじめに

シリーズの結果を比較し、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名をファイルへ記録してから実行する。

  1. Fluentdの送信先を戻し、MSKへのproducerを止める
  2. Managed Service for Apache Flink applicationをsnapshot付きで停止する
  3. 第7回で作成したmaintenance schedule、Scheduler role、maintenance runtime role、job fileを削除する
  4. EMR Serverlessのjob終了を待ち、applicationを削除する
  5. MSK Connect connector、worker configuration、custom pluginを削除する
  6. Amazon MSK clusterを削除する
  7. 本シリーズで追加したstreaming tableだけを削除する。既存Glue databaseとbatch tableは残す
  8. 検証専用artifact bucketに限り、未完了multipart upload、object version、delete markerを削除する
  9. 検証専用artifact bucketを削除する。Raw/Iceberg/Athena結果bucketは残す
  10. 検証専用IAM role/policy、Secrets Manager secret、KMS keyを削除する
  11. 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、費用、削除まで確認できた状態を完了とする。

関連記事

実機検証について

本稿は未検証のcleanup checklistである。削除は不可逆なため、対象ARNとbackupを再確認し、PoC専用resourceに限って実行する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?