🛠️
AWS Code Build で、S3 上のファイルを日次チェックして Slack 通知する
やりたいこと
- なんらかの別の処理で、S3上に毎日 dt=yyyymmdd ディレクトリがつくられてファイルが生成されている。
- そのファイル生成処理が正しいかを日次でチェックして、結果をSlack通知させたい
流れ
- EventBridge Scheduler -> Code Build の jobでS3上のファイルをチェック -> Slack 通知(Webhook呼び出し)
この方式の良い点
- buildspec.yaml を書くぐらいで完結する(呼び出すterraformのほうも書く必要はあるが...)
- Lambda を生み出さない 😀
buildspec.yaml のサンプル
version: 0.2
env:
variables:
DEST_BUCKET: ""
parameter-store:
SLACK_WEBHOOK_URL: "/slack/foobar_webhook_url"
phases:
install:
runtime-versions:
python: 3.11
build:
commands:
# 前日分をチェック
- 'echo "前日のファイル配置をチェックします"'
# エラー情報を格納する配列を初期化
- 'ERROR_MESSAGES=""'
- 'HAS_ERROR=0'
# 前日の日付を取得
- |
CHECK_DATE=$(date -d "1 day ago" +%Y%m%d)
echo "=== チェック対象日付: $CHECK_DATE ==="
# 期待するS3パス:
# s3://${DEST_BUCKET}/target/foobar1/dt=${CHECK_DATE}/
# s3://${DEST_BUCKET}/target/foobar2/dt=${CHECK_DATE}/
# s3://${DEST_BUCKET}/target/foobar3/dt=${CHECK_DATE}/
TARGETS="foobar1 foobar2 foobar3"
TOTAL_TARGETS=3
# 各パスのファイル存在をチェック
MISSING_TARGETS=""
FOUND_COUNT=0
for TARGET in $TARGETS; do
FILE_COUNT=$(aws s3 ls "s3://$DEST_BUCKET/target/${TARGET}/dt=${CHECK_DATE}/" | wc -l)
if [ "$FILE_COUNT" -eq 0 ]; then
MISSING_TARGETS="${MISSING_TARGETS}${TARGET} "
else
FOUND_COUNT=$((FOUND_COUNT + 1))
fi
echo "${TARGET}: ${FILE_COUNT}件"
done
echo "検出ファイル数: ${FOUND_COUNT}/${TOTAL_TARGETS}"
# 不足しているターゲットがある場合はエラー
if [ -n "$MISSING_TARGETS" ]; then
ERROR_MESSAGES="⚠️ ${CHECK_DATE}: 不足パス [${MISSING_TARGETS}]"
HAS_ERROR=1
echo "⚠️ ファイル不足を検出: ${MISSING_TARGETS}"
else
echo "✅ ファイル配置正常"
fi
# 結果を判定してSlack通知
- |
if [ "$HAS_ERROR" -eq 0 ]; then
MESSAGE="✅ ファイル配置: 正常(${CHECK_DATE})"
COLOR="good"
EXIT_CODE=0
else
MESSAGE="<!channel> ⚠️ ファイル配置: 異常\n${ERROR_MESSAGES}"
COLOR="danger"
EXIT_CODE=1
fi
echo -e "$MESSAGE"
# Slack通知(色付きブロック)
- |
PAYLOAD=$(cat <<EOF
{
"attachments": [
{
"color": "$COLOR",
"title": "S3 Data Check",
"text": "$MESSAGE",
"mrkdwn_in": ["text"]
}
]
}
EOF
)
curl -X POST -H 'Content-type: application/json' \
--data "$PAYLOAD" \
"$SLACK_WEBHOOK_URL"
# 異常時はビルド失敗
- 'exit $EXIT_CODE'
Discussion