継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Personal Health Dashboard の通知を Slackに投稿する

タダです.

AWS のサービスの状態やメンテナンス情報を知るために Personal Health Dashboard(以下 PHD) を使うのは有効です.PHDは通常 AWS マネジメントコンソール上から確認できますが,今回は PHD の通知を Slack に自動投稿するための設定方法を紹介します.

PHD の通知を受け取る方法

PHD の通知を受け取るには CloudWatch Events を使います.イベントソースパターンでサービス名に Health,イベントタイプを すべてのイベント に設定します.ターゲットに SNS を指定します.これで PHD からのすべての通知が SNS で設定したプロトコル(例 Eメール等)利用者に通知できます.

f:id:sadayoshi_tada:20200308150229p:plain

なお,PHD の CloudWatch Events は次の JSON 形式で通知があるため通知内容をカスタマイズしたい場合は別途 Lambda 等を挟む必要があります.この記事ではデフォルトの通知内容で設定を進めます.

{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "AWS Health Event",
  "source": "aws.health",
  "account": "123456789012",
  "time": "2016-06-05T06:27:57Z",
  "region": "us-west-2",
  "resources": [
    "i-abcd1111"
  ],
  "detail": {
    "eventArn": "arn:aws:health:us-west-2::event/AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED_90353408594353980",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED",
    "eventTypeCategory": "issue",
    "startTime": "Sat, 05 Jun 2016 15:10:09 GMT",
    "eventDescription": [
      {
        "language": "en_US",
        "latestDescription": "A description of the event will be provided here"
      }
    ],
    "affectedEntities": [
      {
        "entityValue": "i-abcd1111",
        "tags": {
          "stage": "prod",
          "app": "my-app"
        }
      }
    ]
  }
}

{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "AWS Health Abuse Event",
  "source": "aws.health",
  "account": "123456789012",
  "time": "2018-08-01T06:27:57Z",
  "region": "global",
  "resources": [
    "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111",
    "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd2222"
  ],
  "detail": {
    "eventArn": "arn:aws:health:global::event/AWS_ABUSE_DOS_REPORT_92387492375_4498_2018_08_01_02_33_00",
    "service": "ABUSE",
    "eventTypeCode": "AWS_ABUSE_DOS_REPORT",
    "eventTypeCategory": "issue",
    "startTime": "Wed, 01 Aug 2018 06:27:57 GMT",
    "eventDescription": [
      {
        "language": "en_US",
        "latestDescription": "A description of the event will be provided here"
      }
    ],
    "affectedEntities": [
      {
        "entityValue": "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"
      },
      {
        "entityValue": "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd2222"
      }
    ]
  }
}

AWS Chatbot での Slack の連携設定

もう一歩踏み込んで Slack 通知の設定を行いましょう.AWS では Slack と連携可能な「AWS Chatbot」があります.現在ベータ版のサービスです.なお,AWS Chatbot は Slack の他に Amazon Chime とも連携可能です.

AWS Chatbot では PHD イベント(Health イベント) を受け取ることができるので今回活用します.

Q: AWS Chatbot を使うとどのような通知を受け取ることができますか? AWS Chatbot を使用すると、CloudWatch アラーム、Health イベント、Security Hub の検出結果、Budgets アラート、CloudFormation スタックイベントに関する通知を受け取ることができます。

aws.amazon.com

AWS Chatbot で Slack 連携するメリットは次の2点があると考えます.1つは 上記のように PHD のイベントを受け取るように対応したサービスであることです.2つ目は料金の観点でのメリットです.AWS Chatbot 登場以前は Slack の Eメールアプリを使っていたかと思いますが,Slack の Eメールアプリはスタンダードプランまたはプラスプランじゃないと使えないのですが,AWS Chatbot はプランを気にせず Slack 連携できるのもメリットです.

slack.com

AWS Chatbot 設定

1. Slack との連携承認

サービス画面から順次設定していきます.まずは Slack との連携承認を行います.

チャットクライアントに Slack を設定して連携先のワークスペースと連携承認を行います. f:id:sadayoshi_tada:20200308153210p:plain f:id:sadayoshi_tada:20200308153207p:plain

設定完了したら次に「新しいチャネル設定」をクリックします. f:id:sadayoshi_tada:20200308153202p:plain

2. チャネル設定

チャネル設定の詳細をさらっていきます.

最初にチャネル名と Slack の通知チャンネルを指定します. f:id:sadayoshi_tada:20200308153155p:plain

次に,IAM ロールの作成を行います.デフォルト設定で作ります. f:id:sadayoshi_tada:20200308153151p:plain

IAM ポリシーは次の内容で自動生成されます. CloudWatch に関するものですね.

カスタム管理ポリシー: AWS-Chatbot-NotificationsOnly-Policy-乱数

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudwatch:Describe*",
                "cloudwatch:Get*",
                "cloudwatch:List*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

信頼関係ポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "chatbot.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

そして,SNS 通知設定を行います.AWS Chatbot はSNS からの通知との統合可能なので PHD の CloudWatch Events で設定したターゲットの SNS を設定して準備完了です. f:id:sadayoshi_tada:20200308153146p:plain

指定した SNS トピックのサブスクリプションAWS Chatbot の設定が入っています. f:id:sadayoshi_tada:20200308153142p:plain

3. テストイベントによる動作確認

以上で PHD の通知を Slack に通知する設定が完了しました.最後に次のサンプルイベントを SNS 通知してみましょう.SNS のメッセージにサンプルイベントを入れて送信してみます.

{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "AWS Health Event",
  "source": "aws.health",
  "account": "123456789012",
  "time": "2016-06-05T06:27:57Z",
  "region": "us-west-2",
  "resources": [
    "i-abcd1111"
  ],
  "detail": {
    "eventArn": "arn:aws:health:us-west-2::event/AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED_90353408594353980",
    "service": "EC2",
    "eventTypeCode": "AWS_EC2_INSTANCE_STORE_DRIVE_PERFORMANCE_DEGRADED",
    "eventTypeCategory": "issue",
    "startTime": "Sat, 05 Jun 2016 15:10:09 GMT",
    "eventDescription": [
      {
        "language": "en_US",
        "latestDescription": "A description of the event will be provided here"
      }
    ],
    "affectedEntities": [
      {
        "entityValue": "i-abcd1111",
        "tags": {
          "stage": "prod",
          "app": "my-app"
        }
      }
    ]
  }
}

f:id:sadayoshi_tada:20200308160437p:plain

Slack の指定したチャンネルにポストされました!アカウント番号,リージョンのほかに影響あるリソースもカスタマイズ不要で自動でいい感じに通知されています.

f:id:sadayoshi_tada:20200308160500p:plain

まとめ

PHD の通知を AWS Chatbot で Slack 連携してみました.AWS Chatbot のおかげでノーコーディングで Slack への通知ができました.Slack を使っていて AWS Chatbot で対応しているイベントを拾いたい場合,運用中のシステムに関連するイベントは感知しやすくすると良いと感じました.AWS Chatbot を初めて使いましたが積極的に使いたいです.

AWS CLI v2 でどんな機能が実装されたのかを確認する

タダです.

AWS CLI のv2がリリースされました.v1 から追加された機能が何かを把握していくためにこの記事で整理していきます.

aws.amazon.com

v2 で追加された機能

なお,追加された機能を確認した情報源は公式ブログおよびドキュメント, GitHubCHANGELOG からです.

クレデンシャル設定の手段が追加

v1 の時は, aws configure を実行してアクセスキーとシークレットアクセスキーを設定するのが基本でした.v2 では aws configure に次の機能が追加されました.

aws configure import コマンドで CSV ファイルから認証情報をインポート可能

コマンドは次の様に実行します.

aws configure import --csv file://[CSVファイルのパス]

aws configure wizard コマンドで認証情報設定をナビゲートが可能

コマンド実行後にどの認証情報を設定するかナビゲートしてくれます.なお,wizard コマンドは configure のほか IAM,DynamoDB,Lambda が対応しています.

 aws configure wizard
What would you like to configure
> Static Credentials
  Assume Role
  Process Provider
  Additional CLI configuration

aws configure sso コマンドで AWS SSO を利用可能に

AWS Single Sign-On(AWS SSO)の認証情報利用がサポートされました.ドキュメントの解説はこちらです.

CLI パラメーターの自動補完機能

v2 で対話型機能 --cli-auto-prompt オプションが追加されました.例えば,IAM ユーザーを作ろうとした時にコマンド実行に必要なパラメーターを補完してくれます.

aws iam create-user --cli-auto-prompt
--user-name:

--user-name [string]: The name of the user to create.

サービス名の自動補完機能

v1 でも補完機能はありましたが v2 でも機能として強化され,サービスのリソース名が補完される様になりました.

AWS_REGION 環境変数の追加

AWS_REGION 環境変数が追加されました.この変数は AWS_DEFAULT_REGION よりも優先されます.

該当の issue github.com

プロファイル情報をリストするコマンドが追加

aws configure list-profiles コマンドが追加されました.設定しているプロファイル情報をリストしてくれます.

$ aws configure list-profiles
default
XXXX
XXXX
XXXX
XXX

該当の issue github.com

YAML 入出力のサポート

入力では --generate-cli-skeletonyaml-input がパラメータとしてサポートされました. CLI の実行アウトプットをこれまでは JSON か TABLE,TEXT 形式で出力できてましたが,YAML 形式がサポートされました.--output yaml--output yaml-streamが使えます.

aws dynamodb list-tables --output yaml
もしくは
aws dynamodb list-tables --output yaml-stream

サービス別の追加コマンドおよびパラメータ

各サービスで追加されたコマンドおよびパラメーターがあるので紹介します.

  • ddb put : DynamoDB テーブルにデータを投入するための高レベル API コマンド
  • ddd select : DynamoDB テーブルまたはインデックスを検索するための高レベル API コマンド
  • logs tail : CloudWatach Logs のログを tail が可能になったコマンド
  • --copy-props : S3 から S3への転送時に指定するパラメーターとして追加

まとめ

AWS CLI v2 で追加された機能が何かを整理しました.頻繁に使うツールの1つなので動作を理解し,バージョンアップにも追随していきたいと思います.v2 の機能について気になっている人にとって何か参考になることがあれば幸いです.

GitHub/CodeBuild/CodePipeline の CI/CD パイプラインを CDK で実装する

タダです.

CDK で CI/CD パイプラインを作る機会があったのでこの記事で構成の仕方をまとめます.

構成図

この記事での構成は以下の通りです.GitHub からコードをポーリングして CodeBuild でビルド・テスト・デプロイするためのパイプラインを CodePipeline で作ります。

f:id:sadayoshi_tada:20200223150242p:plain

なお, CDK の TypeScript プロジェクトをビルド・テスト・デプロイする工程を定義してます.動作確認はバージョン1.25.0 で確認しています.

cdk --version
1.25.0 (build 5ced526)

パイプラインの実装

CodePipline と CodeBuild のパッケージをインストールします.

npm install @aws-cdk/aws-codebuild @aws-cdk/aws-codepipeline @aws-cdk/aws-codepipeline-actions

CodeBuild と CodePipeline の組み合わせはドキュメントを参考に実装しました.

先ほど導入したパッケージをインポートして,リソースを定義していきます.CodePipeline に CodeBuild を追加する場合は,PipelineProject クラスを使います.CDK 特有の部分としてデプロイ時にcdk deployコマンドの--require-approvalオプションを入れて,手動承認プロセスを無視した自動デプロイが可能なようにしています.

import * as codebuild from '@aws-cdk/aws-codebuild';
import * as codepipeline from '@aws-cdk/aws-codepipeline';
import * as codepipeline_actions from '@aws-cdk/aws-codepipeline-actions';

~中略~

    const build = new codebuild.PipelineProject(this,'TestBuild',{
      buildSpec: codebuild.BuildSpec.fromObject({
        version: '0.2',
        phases: {
          install: {
            commands: [
              'npm install -g aws-cdk',
              'npm install -g typescript'
            ]
          },
          pre_build: {
            commands: 'npm i'
          },
          build: {
            commands: [
              'npm run build',
              'npm run test'
            ]
          },
          post_build: {
            commands: [
              'cdk deploy --require-approval never'
            ]
          },
        },
      }),
~中略~

次に,CodePipeline で CI/CD のステージを構成していきます.Source ステージで GitHub からコードを取得する処理を入れるのですが,aws-codepipeline-actions module を使います.oauthToken のパラメーターで GitHub の OAuth トークンを指定しているのですが,確認できているのは現状直書きしています.トークンはマネージドサービスの SecretManager に格納するようにしたい...また,GitHubソースコードをポーリングするために triger のパラメーター GitHubTrigger.POLL で指定しています.

    const pipeline = new codepipeline.Pipeline(this,'TestPipeline',{
      stages:[
      {
        stageName: 'Source',
        actions: [
          new codepipeline_actions.GitHubSourceAction({
          actionName: 'GitHub',
          owner: 'ユーザー名',
          repo: 'リポジトリ名',
          branch: 'ブランチ名',
          oauthToken: new cdk.SecretValue('トークン'),
          trigger: codepipeline_actions.GitHubTrigger.POLL,
          output: sourceOutput
        })
        ]
      },

Build ステージでは CodeBuild の振る舞いを定義します.こちらは,ドキュメントの定義にのっとり設定しました.

      {
        stageName: 'Build',
          actions: [
            new codepipeline_actions.CodeBuildAction({
              actionName: 'CDK_Build',
              project: build,
              input: sourceOutput,
              outputs: [cdkBuildOutput],
            })
          ]
        },
      ],
    });
  }
}

以上の定義をデプロイすると次のパイプラインが出来上がります.これで GitHub の所定ブランチが更新されると自動で CI/CD を実行する構成ができました.

f:id:sadayoshi_tada:20200223145327p:plain

まとめ

GitHub/CodeBuild/CodePipeline を使った CI/CD パイプラインを CDK で作ってみました.シンプルな作りとなっているため,今後 buildspec.yamlの処理をブラッシュアップしてそれをまたブログにしていきたいと思います.

関連ドキュメント

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

『Amazon Builder's Library』オンライン輪読会 第3回開催レポート

タダです.

Amazon Builder's Library」オンライン輪読会の第3回を開催しましたのでレポートします.

開催経緯

開催の経緯は, kdnakt さんがまとめてくれています.オンライン輪読会は2回目なのである程度やり方も確立されてきていい感じです. kdnakt.hatenablog.com

お題目

今回の輪読は,[運用の可視性を高めるために分散システムを装備する]を読みました.Amazon のシステムの運用での知見を学びたくて選びました. aws.amazon.com

資料

所感

インストルメンテーション」がとても頻繁に出てきた言葉でした.これはパフォーマンスのレベルを監視または測定し、エラー診断、トレース情報を記録することを意味で,文中ではログや監視データに出力して利用していました.特に,Amazon のような毎秒2,000万件超えのリクエストを裁くサービスでのプラクティスは気付きがあり,輪読のメンバーごとの会社での取り組みを聞けて私も勉強になりました.

監視のデータでは,エラーが発生することはわかっても原因の特定に役立つわけではないと文中にあっったのですが必ずしもそうではないのかもしれません.例えば,AWS のサービスは各サービスごとに監視情報が CloudWatch 上で公開され利用者は確認することができます.輪読会では, EC2 のステータスチェックの情報で障害を検知して対処するきっかけとなったという話がありました.なので,必ずしも原因の特定に役立たないこともないなと気づきを得ました.

まとめ

[運用の可視性を高めるために分散システムを装備する]輪読会のレポートでした.

次回は[キャッシングの戦略と課題]を読みます.担当は脱脂綿さんです.お願いします!

aws.amazon.com

過去の開催レポート

『The Amazon Builder's Library』オンライン輪読会 第1回開催レポート kdnakt.hatenablog.com

CDKでのインフラとアプリの開発を実践する『実践 AWS CDK - TypeScript でインフラもアプリも!』を出します!

タダです.

技術書典8で「実践 AWS CDK - TypeScript でインフラもアプリも!」という本を会社の有志メンバーと出します! この記事でどんな本なのかを紹介します.

f:id:sadayoshi_tada:20200204093302p:plain

本書の概要

本書は,感情分析システムの開発体験を通して学ぶ、実践的な AWS CDK の入門書です.本書を読むことでインフラとアプリケーションの双方を迅速に開発する方法を学ぶことができます.言語は TypeScript を使っています.

Web サイト silverworks-techbookfest.tumblr.com

目次

  • 1章 AWS CDK の概要
  • 2章 AWS CDK のはじめかた
  • 3章 TypeScript 入門
  • 4章 Step Functions 入門
  • 5章 感情分析システムを作ろう
  • 6章 デバッグとテスト
  • 7章 AWS CDK Tips
  • Appendix

本書で学べること

本書を通じて次のことを学ぶことができます.本書では手を動かして学ぶことを主眼にコードも豊富に掲載しているため,ハンズオンしつつ読んでもらえればより学びがあると思います.

  • AWS CDK の TypeScript による開発を行う為の準備,プロジェクトとコードの作成,デバッグやテスト,デプロイといった AWS CDK 開発の実践方法
  • 感情分析システムは Step Functions ワークフローを中心にしたサーバーレスアーキテクチャになっているため,Step Functions のアーキテクチャや使い方
  • 実務を通じて得られた AWS CDK 開発に関する Tips

本書の対象読者

また,本書は次のニーズに応える内容になっています.

  • AWS での Infrastructure as Code に興味がある人
  • AWS CDK 開発に興味がある人
    • 特にAWS CDK の開発を手を動かして学びたい人
  • Step Functions やAI サービスのアーキテクチャに興味がある人

頒布情報

Silverworks は初日2/29の「い 06」で本を頒布します.是非お立ち寄りください!

まとめ

技術書典8で出版する書籍の概要と頒布情報をまとめました.興味ある!って人や買いに行こうかなと思った人はぜひ下記ページのチェックリストに追加していただけると嬉しいです. 当日お会いできることを楽しみにしています!

techbookfest.org