フォーム読み込み中
こんにちは。ソフトバンク株式会社の王文礼です。
弊社はネットワークサービスのみならず、クラウドからデータセンターまでの各種サービスをご提供しております。クラウドサービスにおいて、主なパブリッククラウド、例えば、Amazon Web Services、Microsoft Azure、Google Cloud、Alibaba Cloud などを顧客に提供する一方、社内でも広範囲で利用されています。
クラウドサービスを提供・利用する上で、クラウド障害が発生した時、その障害情報を迅速に関係部署に伝えることが必要です。
本記事では、Amazon Web Services の障害情報を社内関係部署に共有するために、構築したシステムをご紹介します。
AWS Health Dashboard は AWS Service Health Dashboard と Personal Health Dashboard を統合した新しいダッシュボードです。AWS Health Dashboard にアクセスすると、各リージョンおよび各サービスの稼働状況、サインインしているアカウントに関するイベントが表示されます。
「サービスの状態」メニューは、各リージョンおよび各サービスの稼働状況を表示します。
「アカウントの状態」メニューは、ユーザのアカウントに関するイベントを表示します。
AWS が提供している障害通知ツール(aws-health-tools)を使って、AWS Health Dashboard に掲載されるリージョン規模の障害情報を Slack、Chime、SNS へ送信することができます。この記事では aws-health-tools と Slack との連携方法を解説します。
Slack との連携方法について、2 つあります。
AWS 公式に Slack Incoming Webhook の利用のみ言及されていますが、実は Slack Workflow Builder も利用できます。Incoming Webhook の場合、社内ルールで審査が必要となることが多いため、Workflow Builder を使うことにしました。
1. Slack ワークフローを設定
Slack Workflow Builder を開き、ワークフローを設定します。ワークフローを公開した後の URL を控えておいて、後ほど使います。
注)ワークフローの作成手順については、ワークフロービルダーガイドをご参照ください。
2. shd-notifier をインストール
AWS CLI にて以下のコマンドを実行し、shd-notifier をダウンロードしてインストールします。
注)AWS CLI コマンドを実行するには、AWS CloudShell を利用するのが便利です。
3. AWS CloudFormation テンプレート を実行
us-east-1 リージョン (N. Virginia) で AWS CloudFormation テンプレート を実行し、CloudFormation テンプレートに必要なパラメーターを記入します。
注)AWS Health Dashboard のエンドポイントが us-east-1 リージョンのみで提供されているため、us-east-1 でスタックを作成しましょう。
1⃣ AppName:Lambda 関数名の一部となります。
2⃣ Bail:更新がない場合、メッセージを送信するかどうかを設定します。
注)BAIL=0 を設定した時の 15 分ごとの通知ですが、イベント(障害)が発生した時に、そのイベントに更新がない場合にも「No update」を通知するものであり、イベントがない場合には BAIL=0 を設定しても通知が行われません。
3⃣ ChatClient:通知に使用するクライアントを設定します。slack を選びます。
4⃣ DEBUG:デバッグを有効または無効に設定します。
5⃣ EndpointArray:手順 1 で控えた URL を記入します。
注)パラメータは JSON 形式の配列で記述する仕様になっているため、ダブル―コーテーションを忘れないでください。
6⃣ LambdaRate:ヘルスダッシュボードの更新を確認する頻度。
7⃣ MessagePrefix:更新メッセージのプレフィックス。
8⃣ RegionFilter:Slack に送信するイベントを関心のあるリージョンのみに制限するための文字列です。例えば、["ap-northeast-1","ap-northeast-3","global"] を指定します。
4. Lambda 関数を確認
CloudFormation テンプレート実行後、4 つの Lambda 関数が作成されます。画像に示すように、この段階では関数内にコードが記述されていません。
5. deploy.sh スクリプトを実行
CloudFormation スタック作成後、deploy.sh スクリプトを実行して、Lambda 関数のコードを更新する必要があります。
shシェルの場合: sh deploy.sh <CF_APPNAME> <REGION>
zshシェルの場合:zsh deploy.sh <CF_APPNAME> <REGION>
deploy.sh スクリプト実行後、再度 4 つの Lambda 関数を確認すると、関数内にコードが記述されました。
6. ステートマシンを確認
イベントがない限り、画像のように、ステートマシンが実行されないままとなります。
注)aws-health-tools で通知対象とするイベントは "statusCode" が "open"、"eventTypeCategories" が "issue"、"eventScopeCode" が "PUBLIC" であるイベントになります。
本来は、定期的に起動される Lambda 関数 Health-Event-Poller-LambdaFn.py が条件に合致するイベントを抽出し、その eventArn を Step Functions のステートマシンに渡して実行をトリガーします。
7. 手動でステートマシンを実行
下記手順に従って、手動でステートマシンを実行し、Slack へ送信できるかどうかをテストします。
1⃣ Step Functions コンソール画面で、ステートマシンを選択し、右上にある「実行の開始」を押します。
2⃣ 現れる「実行の開始」の画面の「入力」のところに、Step Functions に渡すペイロードを入力します。
ペイロードの例:
{
"eventArn": "arn:aws:health:global::event/BILLING/AWS_BILLING_OPERATIONAL_ISSUE/AWS_BILLING_OPERATIONAL_ISSUE_STARV_1657032030",
"maxCount": 15
}
注)このイベントに関する通知が 2 通届いたら、ステートマシンの実行が成功になります。(ステートマシンの「Post Event Status」と「Post Final Event Status」それぞれで通知されるので、2 通の通知が届きます。)
Step Functions に渡すペイロードの構文:
{
"eventArn":"<Health ARN>",
"maxCount": 15
}
<Health ARN> は、すでに Close 済みの AWS Health イベント の ARN を設定します。下記の AWS CLI のコマンドにて、Close 済みのイベントを取得できます。
$ aws --region us-east-1 health describe-events --filter "eventTypeCategories=issue,eventStatusCodes=closed"
3⃣ 右下の「実行の開始」を押します。
8. ステートマシンの実行状況を確認
ステートマシンの実行が成功したら、画像のように各ステップが緑色で表示されます。
ステートマシン実行後、「実行の開始」の画面の「入力」のところに、Step Functions に渡したペイロードが消え、コードの記述がなくなります。
9. Slack チャンネルを確認
正常に実装できたら、Slack チャンネルに下記のようなメッセージが届きます。
AWS リージョン規模でサービス障害が発生した時、その障害情報を Slack チャンネルに送信するシステムの構築や構築時の注意事項について、解説いたしました。今回は Slack チャンネルとの連携をテーマにしましたが、記事内容の大半は SNS との連携についても役立ちます。
CLI コマンド、Cloud Formation、Lambda 関数、Step Functions も利用されますが、詳しく説明したため、AWS の初心者でも、本記事をご参照しながら、自社用の障害情報通知システムを構築できるのではないかと思います。読者の皆さまのためになれば幸いです。
ソフトバンクはAWS アドバンストティアサービスパートナーです
「はじめてのAWS導入」から大規模なサービス基盤や基幹システムの構築まで、お客さまのご要望にあわせて最適なAWS環境の導入を支援します。
条件に該当するページがございません