こんにちは!Sentryを日々の開発や運用で使い倒しているかい?
エラーが発生したときにメールが飛んできたり、Slackに通知が来たりするアレだ。非常に便利なんだけど、現場で長く運用していると「自社の特殊な社内チャットツールに飛ばしたい」「エラートラッキングと同時に、社内のインシデント管理DBへ自動でチケットを起票したい」といった、ちょっとした“わがまま”が出てくるものなんだよね。
そんなとき、OAuthの面倒な認可フローをすっ飛ばして、サクッと爆速でSentryと自社システムを直結できる神機能が「Internal Integrations(内部インテグレーション)」だ。
今回は、このInternal Integrationsの作り方を、初心者でも迷わないように優しく、かつ現場で即座に使えるレベルまで徹底的に解説していくよ。これをマスターすれば、毎日のエラー対応のフローが劇的にスムーズになりますよ。一緒に手を動かしていこう!
—
1. Sentryの「Internal Integrations」とは何者か?
まず大前提として、Sentryの拡張機能には「Public Integration(一般公開用)」と「Internal Integration(社内・個人用)」の2種類がある。
- Public Integration: SentryのApp Store(Integrations Directory)で世界中に公開するためのもの。OAuth 2.0の認可コードフローが必要で、審査もある。
- Internal Integration: 「社内専用」の特権モード。OAuthの面倒な実装が一切不要。ボタンをポチポチッと押すだけで即座にAPIトークンが発行され、SentryのWebhookを受け取ったり、SentryのAPIを叩いたりできる。
要するに、「社内ニート向け(失礼、社内ニッチ向け)の自動化スクリプトやチャット連携を、3分で作るためのチート機能」だと思ってくれていい。
—
2. 基礎セットアップ:Internal Integrationの作成手順
百聞は一見に如かず。まずはSentryの管理画面で、あなた専用の連携チャネル(Internal Integration)を作ってみよう。
ステップ1:設定画面への扉を開く
1. Sentryの組織(Organization)のダッシュボードにログインする。
2. 左下の自分のアイコン、または組織名をクリックして [Settings](設定) に移動する。
3. サイドメニューの下部にある [Integrations] をクリック。
4. 右上あたりにある [Develop Intergration] というリンク(またはボタン)を押す。
5. さらに [Create Internal Integration] を選択だ。
ステップ2:権限(Scopes)の設定
ここが一番重要。このIntegrationに「何を許可するか」を定義する。今回は「エラーを受け取って、コンソールに出力する(あるいは独自チャットに送る)」という基本のHelloWorldを想定して、以下の権限を与えよう。
- Project: `Read & Write` (プロジェクト情報の読み書き。エラーを検知するため)
- Organization: `Read` (組織情報の読み取り)
- Issue & Event: `Read & Write` (エラーイベントの詳細を取得・更新するため)
ステップ3:Webhook URLの設定とトークン発行
- Webhook URL: 後で作る自作の受信サーバー(今回はローカル環境の`http://localhost:3000/webhook`など)のURLを指定する。
- 保存(Save)を押すと、画面の下部に `Token` が発行される。これが君のマスターキーだ。絶対に外部に漏らさないように、環境変数として安全に管理しよう。
—
3. 精度高いHelloWorld:Webhookを受け取るサーバーの実装
さて、Sentry側の準備は整った。次は、Sentryでエラーが発生したときに、それをキャッチする受信サーバーを作ろう。
今回は、最もシンプルで分かりやすい Node.js (Express) を使うよ。
まずはプロジェクトフォルダを作って、必要なパッケージをインストールしよう。
mkdir sentry-internal-bot
cd sentry-internal-bot
npm init -y
npm install express body-parser
そしたら、以下のコードを `server.js` という名前で保存してほしい。これが今回のHelloWorldの心臓部だ。
`server.js` の実装
const express = require(‘express’);
const bodyParser = require(‘body-parser’);
const app = express();
const PORT = process.env.PORT || 3000;
// SentryからのWebhookはJSON形式で飛んでくるのでパースする
app.use(bodyParser.json());
// ==========================================
// Webhook エンドポイントの定義
// ==========================================
app.post(‘/webhook’, (req, res) => {
// Sentryから送られてきたリクエストヘッダー(イベントの種類を特定するため)
const eventType = req.headers[‘sentry-hook-resource’];
const requestBody = req.body;
console.log(`\n🔥 [Sentry Alert] イベントを検知しました!`);
console.log(`- イベントタイプ: ${eventType}`);
// 今回は「Issue(エラーのグループ)」が新規作成・更新されたときをキャッチ
if (eventType === ‘issue’) {
const action = requestBody.action; // created, resolved など
const issue = requestBody.data.issue;
const project = requestBody.data.project;
console.log(`- アクション: ${action}`);
console.log(`- プロジェクト名: ${project.name}`);
console.log(`- エラータイトル: ${issue.title}`);
console.log(`- 詳細URL: ${issue.url}`);
// TODO: ここでSlack以外の自社チャットツール(LINE WORKS, Chatwork, Mattermostなど)のAPIを叩く!
}
// Sentryに対して「正常に受け取りました」と200 OKを即座に返す(これ重要)
res.status(200).send(‘Webhook Received Successfully’);
});
// サーバー起動
app.listen(PORT, () => {
console.log(`🚀 Sentry Internal Integration Server is running on port ${PORT}`);
});
—
4. ローカル環境で動作確認(ngrokの活用)
「よし、コードを書いたぞ!でもローカルホスト(`localhost:3000`)のままだと、Sentryのクラウドから通信できないのでは?」
鋭いね!その通り。クラウドサービスであるSentryからあなたのPCに通信を届けるために、`ngrok`(エングロック)という魔法のツールを使う。
1. [ngrokのサイト](https://ngrok.com/)からツールをダウンロードしてインストール(または適宜セットアップ)する。
2. ターミナルで以下のコマンドを叩く:
ngrok http 3000
3. 画面に表示される `https://xxxxxx.ngrok-free.app` のような公開URLをコピーする。
4. 先ほどSentryで作ったInternal Integrationの設定画面に戻り、Webhook URLに `https://xxxxxx.ngrok-free.app/webhook` を入力して保存する!
さあ、準備は整った。
Sentryのプロジェクト画面に戻り、テスト用のエラーを発生させてみよう。(適当なJavaScriptファイルで `throw new Error(“Hello Sentry Internal Integration!”);` を実行するだけでもいい)
うまく連携できていれば、あなたのローカルのターミナルに、こんな風にログが踊り出すはずだ!
🚀 Sentry Internal Integration Server is running on port 3000
🔥 [Sentry Alert] イベントを検知しました!
- イベントタイプ: issue
- アクション: created
- プロジェクト名: my-awesome-frontend
- エラータイトル: Error: Hello Sentry Internal Integration!
- 詳細URL: https://sentry.io/organizations/…
どうだろう?
「おっ、つながった!」という実感が湧いたんじゃないかな。
—
5. さらに先へ:APIトークンを使ってSentryを自在に操る
Internal Integrationの真骨頂は、受信(Webhook)だけじゃない。
さきほど発行した `Token` を使えば、SentryのREST APIをノータイムで叩くことができる。
例えば、「社内チャットからの指示で、Sentry上の特定のエラーを強制的に解決済みにする(Resolve)」なんてことも、たった数行のコードで実現できるんだ。
const https = require(‘https’);
// SentryのInternal Integrationで発行されたトークン
const SENTRY_TOKEN = ‘sntry_your_generated_token_here’;
const ORGANIZATION_SLUG = ‘your-org-slug’;
const ISSUE_ID = ‘1234567890’; // 該当するIssueのID
const data = JSON.stringify({
status: ‘resolved’
});
const options = {
hostname: ‘sentry.io’,
path: `/api/0/issues/${ISSUE_ID}/`,
method: ‘PUT’,
headers: {
‘Authorization’: `Bearer ${SENTRY_TOKEN}`,
‘Content-Type’: ‘application/json’,
‘Content-Length’: data.length
}
};
const req = https.request(options, (res) => {
console.log(`ステータスコード: ${res.statusCode}`);
});
req.on(‘error’, (error) => {
console.error(error);
});
req.write(data);
req.end();
これを使えば、例えば「社内独自のSlack/Teamsボットから、リアクション絵文字をポチッと押すだけでSentryのエラーがクローズされる」といった、神がかった開発体験を構築できるようになる。
—
おわりに
今回は、Sentryの「Internal Integrations」を使って、社内ツールとの連携基盤を爆速で構築する方法を解説した。
OAuthの面倒な沼にハマることなく、わずか数分でセキュアかつ強力なAPI連携が手に入ったはずだ。
監視・運用という泥臭くなりがちな領域こそ、こうしたモダンでシンプルな拡張性を利用して、自分たちの手で心地よい環境にハックしていこう。
これをマスターしたあなたなら、毎日のエラー対応が少しだけ楽しく、そして圧倒的に楽になるはずだ。ぜひ、自社のワークフローに合わせた最高の自動化ボットを作ってみてくれよな!