AWS

Amazon CloudWatchアラートをAmazon SNSをトリガーとしてAWS LamdaからSlackに通知してみた(環境デプロイ編)

概要

こんにちは、テクニカルサポートの牛山です。
今回、前回の「AMAZON CLOUDWATCHアラートをAMAZON SNSをトリガーとしてAWS LAMDAからSLACKに通知してみた(環境構築編)」記事に関する第2回目の内容となります。
※ AMAZON CLOUDWATCHアラートをAMAZON SNSをトリガーとしてAWS LAMDAからSLACKに通知してみた(環境構築編)

第2回目は、実際にAWS SAM CLIコマンドを用いてAWS上にリソースの構築を実施します。

手順

Node.jsのインストール

今回のプロジェクトでは、「template.yaml」のRumtimeに「nodejs12.x」を指定しますので下記の通りにおこなっていきます。

デフォルト状態のAmazon Linux2にはインストールされていませんのでインストールします。
Node.jsが必要になりますので下記、リンク先にあるNode.jsインストールを参考にセットアップします。
Node.jsのインストール

プロジェクトのビルド

最初の第1回目でgit上からダウンロードしてきたプロジェクトフォルダー群は、テンプレートなので 「sam init」 はせずに 「sam build」 コマンドで一度、ビルドしておきます。

無事に完了するとプロジェクト直下に 「.aws-sam」 というディレクトリが生成されていることが確認できます。

[ec2-user@dev cloudwatch-alarm-to-slack]$ sam build

Building codeuri: . runtime: nodejs12.x metadata: {} functions: ['cloudwatchalarmtoslack']
Running NodejsNpmBuilder:NpmPack
Running NodejsNpmBuilder:CopyNpmrc
Running NodejsNpmBuilder:CopySource
Running NodejsNpmBuilder:NpmInstall
Running NodejsNpmBuilder:CleanUpNpmrc

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

Incoming Webhooksの作成

  1. Slackにサインイン
    Slackアカウントをすでに所持している前提で解説します。

    「https://{ワークスペース名}.slack.com/」

    上記、 「{ワークスペース名}」 箇所に自分の使用しているSlackのワークスペース名を入れていただきブラウザの検索欄に貼り付け、Enterを押してください。

    遷移後、 「Email address」 および 「Password」 を聞かれますので適宜入力し 「Sign in」 ボタンを押します。

    その後、 「このサイトは、Slackを開こうとしています。」 というダイアログが現れますが、アプリ側で開きますかときかれているだけなので、 「キャンセル」 ボタンを押してください。

  2. 新しいSlackアプリを作成
    こちらは、下記リンクを開いていただき、それぞれ、 「App Name」 および 「Development Slack Workspace」 項目を埋めます。
    Create a Slack App

    筆者環境は、下記のようにしました。

    設定項目名 設定値
    App Name CloudWatch Alarm To Slack
    Development Slack Workspace {プルダウンメニューから先ほどサインインしたWorkSpaceを選択します。}

    その後、 「Create App」 ボタンを押します。

  3. Webhooksを追加する
    下記、リンクから、作成したアプリのIncoming Webhooksを有効にします。
    Your Apps

    先ほど作成したアプリ 「CloudWatch Alarm To Slack」 がありますのでクリックします。

    「Building Apps for Slack」 項目の 「Add features and functionality」 プルダウンメニューを開きます。

    「Incoming Webhooks」 項目が出現しますのでクリックし、 「Activate Incoming Webhooks」「Off」 になっているので、Offボタンを押し、 「On」 へ切り替えます。

    切替後、 「Add New Webhook to Workspace」 ボタンが一番下側に出現するのでクリックします。

    すると、下記のようなページに遷移することを確認します。

    CloudWatch Alarm To Slack が MyWorkSpace Slack ワークスペースにアクセスする権限をリクエストしています
    CloudWatch Alarm To Slack の投稿先はどちらにしますか?
    CloudWatch Alarm To Slack がアプリとして投稿することのできる投稿先チャンネルを指定する必要があります

    今回作成したアプリのWebhookから投稿先のチャンネルを 「チャンネルを検索 ...」 欄をクリックし、適宜選択し、 「許可する」 ボタンを押します。

    その後、 「Webhook URL」 が一番下側に表示されるので 「Copy」 ボタンを押し、メモ帳などに 「メモ」 しておきます。

KMS(AWS Key Management Service)でKey作成

AWS LamdaからSlackに対して通知する場合、KMSのキーパラメーターが必要になりますので下記手順で作成します。


  1. [AWSマネジメントコンソール]→上部の検索欄に「KMS」と入力し、[Key Management Service]をクリック。
  2. [キーの作成]をクリックし、キーのタイプで 「非対称」 を選択後、詳細オプションは 「KMS」 を選択し、[次へ]ボタンを押す。
  3. [エイリアス]に 「{分かりやすい任意の名前}」 を入力し、[次へ]ボタンを押す。
  4. [キー管理者]の一覧に、第1回目で作成しました、IAMユーザの作成で作成したユーザが一覧にでてくると思いますので、 「作成されたユーザ」 にチェックをいれ、[次へ]ボタンを押します。
  5. [キーの使用アクセス許可を定義]の一覧でも 「先と同じユーザにチェック」 を入れ、[次へ]ボタンを押します。
  6. [キーポリシーの確認と編集]画面に遷移するので設定内容が正しいことを確認し、[完了]ボタンを押します。
  7. [カスタマー管理型のキー]画面に遷移するので、作成したエイリアス名右側にある 「キー ID」 をメモ帳などにコピー&ペーストします。

筆者環境は、下記のようにしました。

置き換え前 置き換え後
{分かりやすい任意の名前} LamdaSlackKey

AWS CDK認証情報の設定

こちらに関しては、過去別記事で設定の仕方を解説していますので過去記事を参考に設定をおこないます。
AWS CDK認証情報の設定

AWS SAM DEPLOY

「sam deploy --guided」 コマンドを使用して、SAMプロジェクトをデプロイします。

下記、項目をすべて入力し終えると、 「Confirm changes before deploy [y/N]:」 と変更した内容をデプロイしても良いかきかれるので 「y」 を入力し、Enterを押します。

「Allow SAM CLI IAM role creation [Y/n]:」 、AWS SAM CLIロールを作成して良いか聞かれるので 「y」 を入力し、Enterを押します。

「Save arguments to configuration file [Y/n]:」 、設定ファイルに保存しても良いか聞かれるので 「y」 を入力し、Enterを押します。

[SAM configuration file [samconfig.toml]:][SAM configuration environment [default]:] こちらに関しては、なにも入力せずにEnterを押します。

デプロイ途中で[Looking for config file [samconfig.toml] : Not found]とでますが、自動生成されるので問題ありません。
※[Looking for resources needed for deployment: Not found.]こちらも問題ないです。

途中、 [Deploy this changeset?] 、チェンジセットを作成するかきかれるので、 [y] を入力しEnterを押します。

[Successfully created/updated stack] と出力されればデプロイ成功です。

設定項目名 設定値
Stack Name [sam-app]: sam-test-app
AWS Region [us-east-1]: ap-northeast-1
Parameter KeyIdParameter []: {前項でメモっておいたKMSのキーIDを入力します。}
Parameter slackChannelParameter []: Webhooksを追加する項目で通知先に設定したチャンネル名を 「#」 を抜いた形で設定します。
こちらはデプロイ後も変更可能です。
Parameter kmsEncryptedHookUrlParameter []: SlackのIncoming WebhooksのURLを 「https://」 を除いた値で設定します。
こちらはデプロイ後も変更可能です。

[ec2-user@dev cloudwatch-alarm-to-slack]$ sam deploy --guided

Configuring SAM deploy
======================
・
・[中略]
・
CloudFormation stack changeset
CloudFormation stack changeset
----------------------------------------------------------------------------------
Operation  LogicalResourceId                  ResourceType             Replacement
----------------------------------------------------------------------------------
+ Add  SNSTopic1                              AWS::SNS::Topic          N/A
+ Add  cloudwatchalarmtoslackRole             AWS::IAM::Role           N/A
+ Add  cloudwatchalarmtoslackSNS1Permission   AWS::Lambda::Permission  N/A
+ Add  cloudwatchalarmtoslackSNS1             AWS::SNS::Subscription   N/A
+ Add  cloudwatchalarmtoslack                 AWS::Lambda::Function    N/A
----------------------------------------------------------------------------------

Changeset created successfully. arn:aws...[略]

Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y
・
・[中略]
・
Successfully created/updated stack - sam-test-app in ...[略]

※見やすく加工しています。

Alarm作成

  1. [AWSマネジメントコンソール]→上部の検索欄に「CloudWatch」と入力し、 [CloudWatch] をクリック。
  2. 左側、イベントより[CloudWatch]項目[ルール]を選択、[サービス名]に「EC2」を選択し、[イベントタイプ]に「EC2 Instance State-change Notification」を選択する。
  3. 右側、[ターゲット]から先ほどデプロイしたラムダを選択し、[設定の詳細]ボタンを押す。
  4. [名前]項目に「{任意の分かりやすい名前を付ける}」、その後、[ルールの作成]ボタンを押す。

監視テスト

EC2の画面にいき、インスタンスを停止させるとラムダが起動し、CloudWatchのログに記録されます。

今回の監視テストでは下記のようなエラーが出力されうまくいきませんでした。

"errorType": "InvalidCiphertextException"
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"

サンプルプログラム自体、「2019年12月18日」以降、更新されていないので、aws cli内のライブラリに変更が加わり、エラーがでているものと推察されます。

まとめ

やはり、コードが保守されていないと自力での解決は難しくおもいました。

アラートをSlackに通知できれば便利だと思うので、時間があるときに解決へ向けて奔走したいと思います。

最後に、今回作成した、構成図を下記に載せます。

CloudFormationで自動生成されたものとなります。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA