🛠️

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