AmazonSNS モバイルプッシュ通知の証明書の期限迫るを CodeBuild で Slack 通知する


背景

iOS向けのプッシュ通知にAmazon SNSを使うと、Apple証明書をセットする必要があり、有効期限が来たら差し替える必要があります。

Amazon SNSは、有効期限が迫ったらメール通知など仕組みが無いので、自前で構築する必要があります。これまでは以下を元にした仕組みで、特定のEC2サーバーに証明書を転がして、crontabでチェックしていました。めんどうくさい。

根本的には、証明書の差し替え不要なプッシュ通知に移行するのが対策になるのですが、シュッとできるものでもなく、しばらく付き合う必要があるので、せめて楽できるようにしたいなと。

現物

よくよく調べると、AmazonSNSが証明書の期日を知っており、AWS CLIで取れることがわかりました。そしたらopensslコマンドで云々とかcrontabとか廃止できますよ。

  • コンテナイメージは python:3.8-buster を利用しています。
  • slack通知は、python製の slack-cli というものが存在し、インストールも利用も簡単なので使います。
  • EXPIRE_DATEは、期日の1ヶ月前には通知が欲しいので、このようにしています。使途に応じて調整してください。
  • CodeBuildビルドプロジェクトに、AmazonSNS の Read 権限が必要です。そんな細かく制御する要件は無かったので、IAM で AmazonSNSReadOnlyAccess を付けています。
  • このジョブを、毎日1回、動かします。
version: 0.2

env:
  variables:
    SLACK_CHANNEL_NAME: "notification_test"
  parameter-store:
    SLACKBOT_API_TOKEN: "slackbot-api-token"
  exported-variables:
    - EXPIRE_DATE

phases:
  install:
    commands:
      - echo "dash dash/sh boolean false" | debconf-set-selections
      - DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash
      - apt update
      - apt install -y unzip jq
      - pip install --upgrade --quiet pip
      - pip install --quiet awscli slack-cli
      - aws --version
      - slack-cli --help

  build:
    commands:
      - EXPIRE_DATE=$(date --date 'next month' '+%Y-%m-%d')
      - |
        aws sns list-platform-applications \
        | jq -cr '.[][]  | select(.Attributes.AppleCertificateExpirationDate) | (.Attributes.AppleCertificateExpirationDate | .[:10]) as $yyyymmdd | select($yyyymmdd <= "'${EXPIRE_DATE}'") | [ $yyyymmdd, .PlatformApplicationArn ] | @csv'\
        | sort \
        | tee expire.log
      - cat expire.log | slack-cli -t ${SLACKBOT_API_TOKEN} -d "${SLACK_CHANNEL_NAME}"

参考