継続は力なり

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

【サービス概要編】AWS の運用をサポートする Systems Manager を理解する

タダです。

AWS では既存のシステムを Lift (移行)した後に Shift (最適化)していくことで AWSクラウドメリットを得られます。そのため、運用・管理系のサービスである、AWS Systems Manager(以下、Systems Manager)の機能を理解し、運用から AWS ライクにしていけるはずです。今回から Systems Manager の概要と各機能の特徴を理解して、運用時のユースケースを考えていく記事を書いていきます。本記事は Systems Manager のサービス概要をまとめます。

aws.amazon.com

サービスの概要

Systems Manager は EC2 だけでなくオンプレミスや仮想マシン、他の AWS リソースを設定・管理するためのサービスです。サーバーの運用に役立つ機能が集まっているのが特徴的です。

www.slideshare.net

Systems Manager の機能は大きく次の通りです。

  • リソースグループ機能
  • インサイト機能
  • アクション機能
  • 共有リソース機能

各機能の概要

リソースグループ機能

リソースグループ機能は、全て同じリージョンにあり、クエリで指定された条件に適合する AWS リソースのコレクションを指します。リソースグループを使うと、タグで指定指定した条件に従って AWS リソースの情報を整理できるので、後述の Automation をはじめとした機能で管理するタスクを容易にします。

インサイト機能

インサイト機能では、AWSリソースに関するデータを一元的に表示するための機能を提供します。

たとえば、CloudTrail ログ、Config ルールに関する評価結果やTrusted Advisor レポートなどのリソースグループ内のリソースに関する詳細情報が表示されます。また、CloudWatch ダッシュボード、インスタンスからのソフトウェア情報の収集プロセスを自動化する Inventory Management、インスタンスのパッチ適用管理に役立つ Configuraion Compliance も機能の中に含まれています。

アクション機能

アクション機能は、AWSリソースに対する各種運用のアクションを提供します。アクション機能で提供されるのは、次の機能です。

  • 運用自動化のための Automation
  • サーバーにログイン不要で、多数のサーバーに対してコマンドを実行できる Run Command
  • Linux サーバーに SSH 不要でログイン可能な Session Manager
  • インスタンスへのパッケージ適用やパッケージ化可能な Distributor
  • インスタンスへのパッチ適用の自動化のための Patch Management
  • OSの停止が発生したりする場合を定義する メンテナンスウィンドウ
  • インスタンスが起動時のブートストラップ処理を定義したりする State Management

共有リソース機能

共有リソース機能は、AWS リソースの管理及び設定のための機能を提供しています。Systems Manager が実行するアクションを定義している Systems Manager Documents や設定データ管理や君データの管理のための階層型ストレージである パラメーターストアが含まれています。

Systems Manager を利用するための条件

このサービスを利用するためには以下の条件があります。サポートされている OS のサーバーがインターネットアクセス可能な経路を持っていて、SSM Agent を導入していれば利用するための条件が整います。

  • OS がサポートされているか
  • Systems Manager API へアクセスするためのインターネットアクセスなネットワーク経路があるかどうか
  • Systems Manager にアクセス可能な IAM ロールを作成する
    • EC2 であれば、IAM ポリシーで「AmazonEC2RoleforSSM」をアタッチしておく
  • SSM Agent を導入できているかどうか

参考ドキュメント

docs.aws.amazon.com

料金 / リージョン

そして、サービスを利用する際の料金は、パラメーターストア、ディストリュビューター、オートメーション、オンプレミスの管理の場合は料金が発生します。また、リージョンは記事公開時点では大阪ローカルリージョンを除き全リージョンに展開されています。

参考ドキュメント

aws.amazon.com

aws.amazon.com

まとめ

2019年5月時点の Systems Manager のサービス概要をまとめてみました。次回から各機能の詳細な利用方法を踏まえつつ、ユースケースも考えていきます。Systems Manager を使いこなして AWS の活用が楽になるような情報を書いていけたらと思います!

話題の「文字起こしくん」を開発してハマったことまとめ

タダです。

この記事は、「後回し改善ウィーク」の4日目の記事です。今日で平成が終わりですね。平成中に読み終えたかった「独学プログラマーのためのAIアプリ開発がわかる本」を読了しました。

独学プログラマーのためのAIアプリ開発がわかる本

独学プログラマーのためのAIアプリ開発がわかる本

書籍の概要

本書は、Daiさんの Qiita 記事で紹介されている内容が書籍化されたものになります。

qiita.com

本書では「文字起こしくん」という LINE BOT を開発するのですが、技術として、LINE Message API(以下、Message API)、Google App Script(以下、GAS)、Google Vision API(以下、Vision API)が使われています。以前から Message APIVision API を使ってみたいと思っていたので購入しました。こちらの処理のイメージ図は、上記の記事より引用させていただきました。

https://camo.qiitausercontent.com/af56456ae7f20030acc23c27447bb14d0593d808/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3133343730342f31303936336463662d363065662d323465372d616430632d6433613939353663646535302e706e67

GAS は以前学んだことをまとめましたが、Message APIVision API は初めて触ったのでハマった部分がありました。この記事では、そのハマった箇所についてまとめていきます。なお、僕のプログラミングスペックは基本的な文法はわかるが、API のドキュメント読んだり、自分で複雑なロジックを組んだりはまだできないレベルです。

sadayoshi-tada.hatenablog.com

本書の完成物

最終的に完成するのは、以下のような画像を LINE BOT に対して送信すると、Vision API で解析して画像の中の文字情報を返してくれるものになります。この前出た大会の画像を送ったら、文字情報を読んで返してくれました。

f:id:sadayoshi_tada:20190430221404j:plain f:id:sadayoshi_tada:20190430221408p:plain

本書でハマった部分

そしてハマった箇所は、大きく以下の3点です。それぞれ振り返っていきます。

  • Message API から GAS への Webhook 設定する際の権限設定
  • GAS のコードを修正した際の Webhook 設定も修正する必要があること
  • Message API のリクエストヘッダーにおける認証情報の記述方法

Message API から GAS への Webhook 設定する際の権限設定

まずハマったのが、GAS のアプリケーション公開設定の誤りから Message API から Webhook ができなかったことです。赤枠で囲んだ箇所を「全員(匿名ユーザーを含む)」と設定していないと Webhook の接続がエラーが発生します。エラーメッセージが権限設定の問題かと想起しにくいメッセージ担っているため最初ハマった時にどこで間違ったのか戸惑いました。。 f:id:sadayoshi_tada:20190430222008p:plain

f:id:sadayoshi_tada:20190430222904p:plain

GAS のコードを修正した際の Webhook 設定も修正する必要があること

次に、GAS のコードを何回も修正したのですが、アプリケーションのデバッグをしてみたものの下記の画像のようにログに表示されているメッセージが全て一緒になっていました。

f:id:sadayoshi_tada:20190430223640p:plain

本書には、GAS のコードを更新するたびに Webhook に登録する URL を更新しなきゃいけない事が記載されてましたが見落としていました。GAS のコードを修正後、Webhook の URL も更新することを行えば期待通りの挙動に変わりました。

Message API のリクエストヘッダーにおける認証情報の記述方法

最後に、LINE BOT に送った画像を取得する際、GAS の POST リクエストヘッダー情報に LINE Developers のアクセストークンを送ってあげる必要があります。その際の、コードの書き方で注意が必要になります。ヘッダーの情報の Authorization の部分で、"Bearer(スペース入れる)" +アクセストークン情報 と記述します。僕は Bearer の後にスペースを入れておらず、アクセストークン情報も変数化していたのですが、Bearer との間に当初不要なスペースを入れていました。

正しい記述

 "Authorization": "Bearer " +アクセストークン情報

誤っていた記述

 "Authorization": "Bearer" + アクセストークン情報

エラーメッセージは以下のようになっていました。リクエストヘッダーを作っている部分でのエラーとは認識していたのですが、不要なスペースによって引き起こされたとは思わず、スペースの問題に気づけずに2時間ほどハマりました。同じようなエラーに遭遇した方は、不要なスペースが入っていないかを確認してみてください。。

https://api.line.me/v2/bot/message/100001/content/ のリクエストに失敗しました(エラー: 404)。サーバー応答の一部: {"message":"Not found"}(応答の全文を見るには muteHttpExceptions オプションを使用してください) at xxxx(コード:7)

参考情報

developers.line.biz

まとめ

独学プログラマーのためのAIアプリ開発がわかる本」に取り組んで、僕がハマったことをまとめてみました。上記以外は特にハマらず、すんなりと開発ができたのでとても良心的な内容になっています。

個人的には実用的なアプリケーションを開発できたこともよかったのですが、各社のサービスや API の仕様を確認しつつ実装していくのもいい経験でした。次は本書で学んだことを活かして、違うクラウドサービスの API で遊んでみたり、Python で実装も行なっていきたいと思います!

「【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門」で扱ったデータ分析のコーディング手法をまとめる

タダです。

この記事は「後回し改善ウィーク」の3日目の記事です。機械学習やデータ分析の勉強目的で Udemy で購入したまま進んでなかった「【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門」に取り掛かっています。

Python の文法やデータ解析で使うライブラリやコーディングを学び、Kaggle 日本語版である SIGNATE の練習問題を解いてコンペに参加するのが本講座の特徴です。また、数式や論文も使わないため初学者の方にとっても取っ掛かりやすいのも良いポイントです。

www.udemy.com

signate.jp

この記事では、これから SIGNATE や Kaggle に挑んでいきたいため、本講座で学んだ Python でのデータ分析に用いたコーディングをまとめて知識を整理します。

開発環境の紹介

開発環境は、 Anaconda を導入して行います。このツールを入れることで、データ解析としてスターダードな JupyterNotebook や Python の各種数理ライブラリも既に入っているので導入後即座に開発できる状況です。

利用したライブラリについて

本講座で扱ったデータ解析のためのライブラリは、以下のものになります。それぞれのライブラリで使った処理別にまとめていきます。

  • numpy
  • pandas
  • matplotlib
  • scikit-learn
    • LiniearRegression
    • DecisionTreeClassifier

CSVの読み出し / 書き出し

データが入ったCSVを読み出したりするときは、pandas を使います。

import pandas as pd

# 読み出し(ヘッダー情報を無しにしたい場合はオプションを指定)
sample = pd.read_csv("sample.csv", header=None)

# 書き出し(ヘッダー情報やインデックスを無しにしたい場合はオプションを指定)
sample.to_csv("sample2.csv", header=None, index=None)

データの中身を確認する

データの中身を確認する方法はいくつかあります。

# 先頭5行を表示する
sample.head()

# 最終5行を表示する
sample.tail()

# 行数と列数を確認する
sample.shape

# 基礎統計量を確認する
sample.desctibe()

# データの型を確認する
sample.info()

データの最大値、平均値、最小値を確認する

データの最大値、平均値、最小値を確認する際は、max()、mean()、min() で行います。

# sample の中にある test のデータの最大値を確認する
sample["test"].max()

# sample の中にある testのデータの平均値を確認する
sample["test"].mean()

# sample の中にある testのデータの最小値を確認する
sample["test"].min()

グラフの描画

データの可視化として、グラフを描画するのに役立つのがmatplotlibです。以下のコード例では、デフォルトの折れ線グラフを表示する例ですが、この他にヒストグラムや箱ひげ図、グリッド線の描画も可能です。

import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline

sample = pd.read_csv("sample.csv")

# y のデータを描画
sample["y"].plot()

# y のデータを描画して横12インチ、縦4インチのサイズのテストと言うグラフを描画
sample["y"].plot(figsize=(12,4), title="テスト")

データの欠損値を確認し、補完する

データの中には、データが欠損しているものがあり、これを確認し、補完するテクニックも学びました。データ操作において影響を及ぼすため、まずはその有無を確認し、欠損値を補います。

# 欠損値の有無の確認
sample.isnull()

# 欠損値がない列の確認
sample.isnull().any()

# 欠損値の合計数の確認
sample.isnull().sum()

# 欠損値の補完(以下の例では欠損値を0で補完している)
sample.fillna(0)

# 欠損値補完後の値の確認
sample.value_counts()

データのモデルを作り、予測する(単回帰、重回帰)

単回帰の場合と、重回帰の場合にわけて、処理の流れをまとめます。単回帰は、説明変数が1つで、重回帰は説明変数が2つ以上の場合の回帰になります。2つの処理の違いで異なるのは、重回帰の場合、質的データ(天候、性別など数字に表現しないデータ)をダミー変数化して数値データで扱えるようにするところにあります。

単回帰の場合

import pandas as pd
from sklearn.linear_model from LiniarRegression as LR

sample = pd.read_csv("sample.csv")
x = sample["x"]
y = sample["y"]

# 回帰モデルの箱を作る
model = LR()

# モデルを作る
model = model.fit(説明変数,目的変数)

# 傾きと切片の確認
model.corf_ # 傾き
model.intercept_ #切片

# モデルを予測する
model.predict(説明変数)

重回帰の場合

import pandas as pd
from sklearn.linear_model from LiniarRegression as LR

sample = pd.read_csv("sample.csv")
x = pd.get_dummies(sample[["x", "z"]]) # ダミー変数化
y = sample["y"]

# 回帰モデルの箱を作る
model = LR()

# モデルを作る
model = model.fit(x,y)

# 傾きと切片の確認
model.corf_ # 傾き
model.intercept_ #切片

# モデルを予測する
model.predict(x)

データのモデルを作り、予測する(決定木)

講座でモデルを作るときにもう1つ学んだ手法が決定木になります。決定木は、質問に対する分岐を階層的に作ることで、判別/回帰を行うモデルです。基本的に2択の選択肢を作るため人間は判別しやすいが、調整しすぎると過学習になりやすいのが注意点です。Graphviz を使って決定木を作ります。

import pandas as pd
from sklearn.tree import DecisionTreeClassifier as DT
from sklearn.tree import export_graphviz
import pydotplus
from IPython.display import Image

sample = pd.read_csv("sample.csv")

# 説明変数化したいカラムを一気に選択する
x = sample.iloc[:,0:10] # iloc[ 開始行:終了行, 開始列:終了列 ]で選択可能

x = pd.get_dummies(sample[["x", "z"]]) 
y = sample["y"]

# 決定木のモデルの箱を作る
model = DT(max_depth=2, min_samples_leaf=500)

# モデルを作る
model.fit(x,y)

# モデルから決定木を表示する(dot ファイルに決定木を表示する)
export_graphviz(model, out_file="tree.dot", feature_names=x.columns, class_names=["0","1"], filled=True, rounded=True)

# モデルから決定木を表示する(JupyterNotebook 上に dot ファイルを表示する)
g = pydotplus.graph_from_dot_file(path="tree.dot")
Image(g.create_png())

まとめ

データ解析のための Python で扱った、頻出コーディング例をまとめました。今回は扱ったのは一例に過ぎないと思うので今後もいろんな表現を学んでいきたいと思います。また、Kaggle や SIGNATE のコンペに参加していって、そこで学んだこともまとめていきます!

最短で AI テクノロジーの基礎を勉強できる「はじめてのAI」の紹介

タダです。

この記事は「後回し改善ウィーク」の2日目の記事になります。「Grow with Google」プログラムをご存知でしょうか? これはGoogle が持つテクノロジーを無償で学べるプログラムです。

grow.google

プログラムとしては、以下のものがありますが、今回学生・教育者向けの「はじめてのAI」講座を受講しましたので所感をまとめていきます。なお、講師は佐藤一憲さんです(@kazunori_279)。

  • 個人向け
  • ビジネス向け
  • 学生・教育者向け
  • スタートアップ向け
  • デベロッパー向け

www.udemy.com

講座の概要

本講座は Udemy のアカウントがあれば無償で受けられまして、5つで構成されています。

  • 第1章 : はじめに
  • 第2章:機械学習でできること
  • 第3章:機械学習のしくみ
  • 第4章:応用事例の紹介
  • 第5章 : 最後に

講座終了後には、修了証をもらえます。 f:id:sadayoshi_tada:20190428224023j:plain

本講座を受講して

本講座では、そもそも AI テクノロジーについて知らない方に向けての講座となります。どんなことが学べるかという以下のことです。

簡単に学んだことをまとめます。

AI テクノロジーの分類

AI テクノロジーは以下の画像のように AI の中に機械学習ニューラルネットワークディープラーニングが内包されています。内側に行けば行くほどより複雑な処理を行うことができます。複雑な処理の例として、画像認識、音声解析、文字の解析などがあります。

f:id:sadayoshi_tada:20190428215217p:plain

AI テクノロジーと従来のテクノロジーとの比較 / 機械学習ニューラルネットワークディープラーニングの概要を掴める

AI テクノロジーの良さは、画像認識を開発する場合、従来のシステム開発だと人が画像を認識するルールを決めていたが、そのルールをコンピューター自身で学んで決めるように自動化できることにあります。これにより人手は介さずに膨大なデータを処理することが可能になり、人はその分別の注力したい作業に注力できるようになります。

AI テクノロジーが定義するルールには判断を間違わないためのパラメーターである「重み付け」を使って判断します。その重み付けをつけて、ニューラルネットワークがどのようにルールを作っていくのかを直近的な見ていけるのが、「Tensorflow Playground」です。単純な問題であればそこまで層は深くないですが、3つ以上のパラメータをつける層(隠れ層)が増えるとそれはディープラーニングとなります。

playground.tensorflow.org

AI の事例を知ることができる

事例として紹介されていたのが、まずキューピーさんの事例です。画像認識の技術を使って素材を分類しています。

www.ryutsuu.biz

また、欲しいお菓子を言うとロボットが選別して拾ってくれるロボットの事例もあります。これは自然言語処理と画像認識の技術が使われています。

youtu.be

人力で頑張ってきた作業を、コンピューターがサクッと作業してくれることで、人は時間が生まれ、他の注力したいことに時間を充てられます。AI を使って解決できる問題があったとして1から AI の仕組みを作れなくても大丈夫です。今は Googleはじめ、AWS、Azureなどのクラウドサービスが AI に関するサービスを出しています。これらのサービスを使ってやりたいことを試してみるところから始めてみると良いと思います。

参考情報

cloud.google.com

aws.amazon.com

azure.microsoft.com

受講後のネクストステップ

受講後のネクストステップも講座内で紹介されていますが、「Grow with Google」プログラム載っているところで「ML Study Jams」を紹介します。

events.withgoogle.com

これも無償のトレーニングプログラムになっており、「QWIKILABS」上でオンライン学習するコンテンツになっています。初級者向けコースと中級者向けコースがあるので、本講座を学んだ後は初心者向け講座での勉強を進んでいくのをお勧めします。期間は限られていますが、5/22が終了期限のようなので興味を持っている方はお早めに申し込みを!

まとめ

AI テクノロジーバズワードになり、僕のように興味を持っている人も多いと思います。そんな方は、1時間ほどで完了する「はじめてのAI」講座を使ってテクノロジーの概要や事例を学んで AI の世界でワクワクしませんか?

CloudWatch Logs のログをアカウントまたぎで共有する

タダです。

この記事は、「challenge-every-month全員でアウトプット芸人 Advent Calendar」と「後回し改善ウィーク」の1日目の記事になります。

業務で CloudWatch Logs のログをアカウントまたぎで共有し、ログ分析に活用する要件がありました。そのための検証を行なったので、まとめていきます。

実現方法

実現するには、CloudWatch Logs のログを送信先アカウントで、 Kinesis Data Streams の設定が必要です。仮に、アカウント A(111111111111)からアカウント B(999999999999)にログを連携する場合で考えます。

以下が手順です。

  1. アカウント B で、 Kinesis Data Streams の送信先ストリーム、データ入力を行うサービスロールの作成と送信先ストリームへの適用
  2. アカウント A で、連携するログのサブスクリプションフィルターを作成
  3. アカウント B で、 Kinesis Data Streams のシャードにログが送信されているかを確認

参考情報

今回の手順は下記のドキュメントに記載があるため、手順に則って検証を行いました。なお、確認した環境は以下になります。

docs.aws.amazon.com

1.Kinesis Data Streams の送信先ストリーム、データ入力を行うサービスロールの作成と送信先ストリームへの適用

まず、ログの送信先のアカウントの設定を行いますが、AWS CLI を使って実施していきます。

最初に、 Kinesis Data Streams に送信先ストリームを作ります。ストリームが有効化されるまで1,2分ほどかかります。

aws kinesis create-stream --stream-name "RecipientStream" --shard-count 1

続いて、サービスロールの作成を行います。なお、サービスロールと適用するポリシーの中身は以下の通りです。

# サービスロール
{
  "Statement": {
    "Effect": "Allow",
    "Principal": { "Service": "logs.ap-northeast-1.amazonaws.com" },
    "Action": "sts:AssumeRole"
  }
}

# ポリシー
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kinesis:PutRecord",
            "Resource": "arn:aws:kinesis:ap-northeast-1:999999999999:stream/RecipientStream"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::999999999999:role/CWLtoKinesisRole"
        }
    ]
}

サービスロールの作成と、ポリシーの適用は以下の通りです。

# サービスロールの作成
aws iam create-role \
--role-name CWLtoKinesisRole \
--assume-role-policy-document file://TrustPolicyForCWL.json

# サービスロールへのポリシーアタッチ
aws iam put-role-policy \
    --role-name CWLtoKinesisRole \
    --policy-name Permissions-Policy-For-CWL \
    --policy-document file://PermissionsForCWL.json

# CloudWatch Logs の書き込み先の作成
aws logs put-destination --destination-name "testDestination" --target-arn "arn:aws:kinesis:ap-northeast-1:999999999999:stream/RecipientStream" --role-arn "arn:aws:iam::999999999999:role/CWLtoKinesisRole"
{
    "destination": {
        "roleArn": "arn:aws:iam::999999999999:role/CWLtoKinesisRole",
        "creationTime": 1555918710180,
        "destinationName": "testDestination",
        "accessPolicy": "{\n  \"Version\" : \"2012-10-17\",\n  \"Statement\" : [\n    {\n      \"Sid\" : \"\",\n      \"Effect\" : \"Allow\",\n      \"Principal\" : {\n        \"AWS\" : \"111111111111\"\n      },\n      \"Action\" : \"logs:PutSubscriptionFilter\",\n      \"Resource\" : \"arn:aws:logs:ap-northeast-1:999999999999:destination:testDestination\"\n    }\n  ]\n}\n\n",
        "targetArn": "arn:aws:kinesis:ap-northeast-1:999999999999:stream/RecipientStream",
        "arn": "arn:aws:logs:ap-northeast-1:999999999999:destination:testDestination"
    }
}

# CloudWatch Logs の書き込み先のポリシー作成
aws logs put-destination-policy \
    --destination-name "testDestination" \
    --access-policy file://AccessPolicy.json

2. アカウント A で、連携するログのサブスクリプションフィルターを作成

続いて、ログの送信元アカウントで Kinesis Data Streams にログを共有するためのサブスクリプションフィルターを作成します。今回は、 CloudTrail のログに記録された「tada」に関するログを送る例を書きます。

aws logs put-subscription-filter \
    --log-group-name "test-trail" \
    --filter-name "RecipientStream" \
    --filter-pattern "{$.userIdentity.type = tada}" \
    --destination-arn "arn:aws:logs:ap-northeast-1:999999999999:destination:testDestination"

3. アカウント B で、 Kinesis Data Streams のシャードにログが送信されているかを確認

最後に、Kinesis Data Streams のシャードにログが送信されているかを確認します。

# シャードのイテレーター情報を取得する
aws kinesis get-shard-iterator \
      --stream-name RecipientStream \
      --shard-id shardId-000000000000 \
      --shard-iterator-type TRIM_HORIZON

# 出力例(ShardIterator の情報をメモしておきます)
{
    "ShardIterator": "AAAAAAAAAAE8Lco6O3cLC0izP1f5u1D1UT01g5ojvj035Tb/XuvIMH+mnthnrGr6MDNi7fSAFVnJnrF2gtGWyn7Qi/dGf+5eOO0iriz8y3K3iBHaBMX9ESB3Zg2nnC2CGntkUyOCQZxRez5BSWmWqrhp1WtvQXvICCbhjIrtTPLRMpPcKyXPIqVa9X4n/f99l8IR9cSQ0+t7Ev1mzFclVD0Lat2EGcn+"
}

# シャードのデータ情報を取得する
aws kinesis get-records \
      --limit 10 \
      --shard-iterator "AAAAAAAAAAE8Lco6O3cLC0izP1f5u1D1UT01g5ojvj035Tb/XuvIMH+mnthnrGr6MDNi7fSAFVnJnrF2gtGWyn7Qi/dGf+5eOO0iriz8y3K3iBHaBMX9ESB3Zg2nnC2CGntkUyOCQZxRez5BSWmWqrhp1WtvQXvICCbhjIrtTPLRMpPcKyXPIqVa9X4n/f99l8IR9cSQ0+t7Ev1mzFclVD0Lat2EGcn+"

# 出力例(Data の情報をメモしておきます)
{
    "Records": [
        {
            "Data": "H4sIAAAAAAAAADWOTQuCQBRF/8ow64jMPsBdiLXIEjJoERKTvvSRzsi8MYnwvzdqLQ/3cu/58AqIRA7ndw3c4350PJ+i8HYI4nizC/iEq1aC7pNSNVkrTFqEKicblCrfadXUNhspNhpENSI1d0o11gaV3GJpQBP3rsnQC14gTY8fjtlYN2g1jKjsmLNcrty1u5jNXceZ/PV6gUvIfnrsp+cxv4D0iTJnBYjSFEw9WGaXUIr+me1RAiExGtSmvEu6Lwa4ORDyAAAA",
            "PartitionKey": "3e21f5e8240cbb048271af4fdb892a1c",
            "ApproximateArrivalTimestamp": 1556373403.028,
            "SequenceNumber": "49595189074146188426156213207759355357749573689819529218"
        }
    ],
    "NextShardIterator": "AAAAAAAAAAGBjdvkN0Th99yo7tnUiLUxwXX7dgG4TinEGCRQrpVR7Y+2euYlNhuDA7KvfYOwC9LdS+ZNj8sSA5boHkLhWsdsLNuo/+Cn2qtzBeJkE1JtcYlhCr7qZowctmxtNHU3qfPSTF/ywSqEjstCEaPoxs083K+AKrj+OvHHNC6fqxkKjeoi51GodxIhnkyRWL3E12ib6teL0JwXSVYg9iUIUc15",
    "MillisBehindLatest": 0
}

# Data の中身を確認する(Base64 でエンコードされているためデコードする.ドキュメントに書いている、「base64 -d」ではデコードできなかったので注意です)
echo -n "H4sIAAAAAAAAADWOTQuCQBRF/8ow64jMPsBdiLXIEjJoERKTvvSRzsi8MYnwvzdqLQ/3cu/58AqIRA7ndw3c4350PJ+i8HYI4nizC/iEq1aC7pNSNVkrTFqEKicblCrfadXUNhspNhpENSI1d0o11gaV3GJpQBP3rsnQC14gTY8fjtlYN2g1jKjsmLNcrty1u5jNXceZ/PV6gUvIfnrsp+cxv4D0iTJnBYjSFEw9WGaXUIr+me1RAiExGtSmvEu6Lwa4ORDyAAAA" | base64 -D | zcat

# 出力例(確認する段階が早すぎたのか、テストメッセージが表示されました)
{"messageType":"CONTROL_MESSAGE","owner":"CloudwatchLogs","logGroup":"","logStream":"","subscriptionFilters":[],"logEvents":[{"id":"","timestamp":1556373402311,"message":"CWL CONTROL MESSAGE: Checking health of destination Kinesis stream."}]}

上記の設定で Kinesis Data Streams にログデータが共有されるようになりました。これでログを Kinesis Data Firehose と連携して S3に出力する構成も可能になりました。

まとめ

CloudWatch Logs のログを Kinesis Data Streamsを使った共有する方法を紹介しました。通常の業務システムのアカウントとログ分析基盤のアカウントを分離したり、ログアーカイブや統合するためのアカウントのような場合に検討できる設定かと思います。何か役に立てば幸いです。

challenge-every-month全員でアウトプット芸人 Advent Calendar」の2日目は @zucky_zakizaki さんの記事になります。お楽しみに!