🐭

パラメータストアを活用してSlackにメッセージを投稿してみた

2024/11/11に公開

こんな方向けの記事です。

・とりあえずSlackにメッセージを飛ばす仕組みを作りたい。
・コードの中にSlackのURLは入れたくない。

https://zenn.dev/mokomap_cloud/articles/38591d84a44cbc

前提

Slackでメッセージを投稿したいチャンネルが存在している事。
nodejsで記載していますのでnode、npmコマンドが入っている事。
今回はAWS CloudShellを使います。
(EC2でも可能ですが、アウトバウンドルール443が開いている必要あり)

さっそく実装(SlackのWebHookURLの生成)

SlackのWebHookURLの作成から行いましょう
自動化メニューから新しいワークフローを作成していきます。

 
 

WebHookからを選択し変数を定義しましょう。
今回は単純なメッセージを送ることが出来れば良いのでシンプルな「text」にします。

 
 

こんな感じになっていればOKです。

 
 

ステップの追加で「メッセージ」を選択し
「チャンネルへメッセージを送信する」を選択しましょう。

 
 

投稿したいチャンネルを選択します。
「{}変数を挿入する」を押下して、先ほど作成した「text」を入れましょう。
こんな感じになっていればOKです。

 
 

次にワークフローの名前を設定しましょう。
これがSlackに投稿される、ユーザ名の代わりになります。

 
 

こんな感じになっていればOKです。

ここまで出来たら完了を押下して、ワークフローを公開しましょう。

次にWebHookのURLを取得します。
「WebHookを使って開始する」を押下して最下部にある「リンクをコピー」
を押下して、WebHookのURLを控えましょう。

さっそく実装(SSMパラメータに登録)

CloudShellから下記コマンドでパラメータストアに登録しましょう。
今回は東京リージョンを使います。

aws ssm put-parameter --region ap-northeast-1 \
  --name "<任意のパス名>" \
  --type "SecureString" \
  --value "<SlackのWebHookのURL>"

コマンド例

aws ssm put-parameter --region ap-northeast-1 \
  --name "/slack/mokomap/test" \
  --type "SecureString" \
  --value "https://hooks.slack.com/triggers/XXXXXXXXX/XXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

 
 

下記が返ってきたら成功です。

{
    "Version": 1,
    "Tier": "Standard"
}

さっそく実装(jsファイル作成)

「@aws-sdk/client-ssm」をインストールしましょう。

npm install @aws-sdk/client-ssm

 
 

jsファイルを作成しましょう。

vi mokomap_slack.js

 
 

下記を貼り付けましょう。

const https = require("https");
const { SSMClient, GetParameterCommand } = require("@aws-sdk/client-ssm");

// AWS SSMクライアントの設定
const ssmClient = new SSMClient({ region: "ap-northeast-1" });

// コマンドライン引数からメッセージを取得
const message = process.argv.slice(2).join(" ");

if (!message) {
  console.error("エラー: メッセージを入力してください。");
  process.exit(1);
}

// SSMパラメータからWebhook URLを取得する関数
async function getWebhookUrl() {
  const command = new GetParameterCommand({
    Name: "/slack/mokomap/test",
    WithDecryption: true,
  });
  const response = await ssmClient.send(command);
  return response.Parameter.Value;
}

// Slackにメッセージを送信する関数
async function sendSlackMessage(webhookUrl) {
  const payload = JSON.stringify({ text: message });

  const url = new URL(webhookUrl);
  const options = {
    hostname: url.hostname,
    path: url.pathname,
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": Buffer.byteLength(payload),
    },
    agent: false,
  };

  // HTTPS リクエストの送信
  const req = https.request(options, (res) => {
    if (res.statusCode === 200) {
      console.log("メッセージが正常に送信されました:", message);
    } else {
      console.error(`メッセージの送信に失敗しました: ステータスコード ${res.statusCode}`);
    }
  });

  req.on("error", (error) => {
    console.error("リクエストエラー:", error.message);
  });

  req.write(payload);
  req.end();
}

// メイン関数
getWebhookUrl()
  .then(sendSlackMessage)
  .catch((error) => {
    console.error("エラーが発生しました:", error.message);
  });

ここまで出来たら完成です!

検証

好きなメッセージを入れてコマンドを実行しましょう。

node mokomap_slack.js "<メッセージ>"

 
 

ちゃんと送られてきてますね!成功です!

ペットに応援されている気分になりますね!笑

あとがき

今回は標準ライブラリの「https」を使用しましたので少し長めの構文になりましたが
「axios」や「node-fetch」を使用すればもう少し構文を短くできそうです。
普段はPythonばかりでNodejsを使うことが無いので今回は勉強がてら作ってみました。
LambdaとBedrockを使って応援の言葉を投げてくれるものも作ってみようかなと思った
今日この頃でした。

この記事は下記ドキュメントを参考にしています。

https://slack.com/intl/ja-jp/help/articles/360041352714-ワークフローを作成する---Slack-外部で開始されるワークフローを作成する

https://docs.aws.amazon.com/ja_jp/cloudshell/latest/userguide/welcome.html

Discussion