AWS Lake Formation

# AWS Lake Formation

https://d1.awsstatic.com/webinars/jp/pdf/services/20191001_BlackBelt_LakeFormation_A.pdf

## データレイクとは

  • データから価値を見出す業務が増え、データは年々増えていく
  • データにアクセスする人々も増えている
  • 分析対象のデータに対する要件も増えている

 

  • データレイクとは
    • 全ての構造化データと日構造化データを保存できる一元化されたリポジトリ
    • データをそのままの形で保存できるため、データを構造化しておく必要がない
    • ダッシュボードや可視化、ビッグデータ処理、リアルタイム分析、機械学習など様々なタイプの分析を実行できる
    • 分析の結果、意思決定を行える
  • なぜデータレイクが必要か
    • 構造化、反構造化、非構造化データの取り扱い
    • ペタバイト、エクサバイトに渡る拡張性
    • 様々な分析および、機械学習ツールとの連携
    • データの移動を伴わずにデータを処理
    • 低コストなデータの保存と分析

 

## AWS Lake Formation 登場の背景

  • データレイクを構築するには(数ヶ月単位の準備が必要)
    1. ストレージのセットアップ
    2. データの取り込み
    3. クレンジング、整形、データのカタログ化
    4. セキュリティの設定と適用
    5. 分析にデータを活用できるようにする

 

  • AWS Lake Formation の概要
    • データの取り込みと構造化(ブループリント)
      • データ管理のテンプレートを提供
      • Glue のトリガー、ワークフロー(一連のETL処理を行う)、クローラー、ジョブを自動で作成
      • 自動的にデータ取り込み
        • データベースからのバルクロード
        • ログをインクリメンタルロード
      • 整形、暗号化
      • S3バケットに保存&アクセス(IAM
        • アクセスを行う対象のS3パス(Data Lake Location
        • Data Lake Location に登録したパスに対するアクセス許可(Data Location
          • データベースやテーブルの作成ができるようになる
        • 以前は様々なサービスに対して設定を行わなければならず、辛かった
    • セキュリティ&コントロールパーミッション
      • ユーザーはAWSサービス(Amazon Athena, AWS Glue, Amazon Redshift, Amazon EMR)を通してアクセス。管理者はLake Formation 上でユーザーのアクセス制御を設定
      • SQLライクなGrant / Revoke でシンプルなアクセス制御を実現
      • 適切なユーザ、グループに正しいデータへのアクセス制御を定義
      • データベース、表、列の単位の粒度で制御可能
      • パーミッションの種類
        • データロケーションのアクセス許可
          • 登録されたS3にデータベースまたはテーブルを作成するため
        • データカタログのアクセス許可
          • データカタログには、基となるデータに関するメタデータが格納される
          • メタデータはテーブルとその集合であるデータベースとして編成されている
          • データカタログのアクセス許可は、データベースとテーブルを作成、編集、削除する権限を Grant / Revoke で与える
        • データアクセス許可
          • ユーザーに対してテーブル、列単位の権限付与
        • 暗黙的なアクセス許可
          • 何かを作成した場合、暗黙的に作成したモノに対しての権限が与えられる
    • 協調&利用(データカタログ)
      • メタデータカタログを利用した検索と定義確認
        • Apache Hive(Athena) メタストアで行うのと同じ方法で、AWS メタデータを保存、解釈付け、共有できるマネージドサービス
      • 全てのアクセスはIAMポリシーによりチェック
      • 新しいデータが取り込まれたり、ツールが変更されてもポリシーにより保護可能
      • アクセス時の連携
        • ユーザーは各種AWS分析サービスに対してクエリを投げる
        • AWS サービスはLake Formation に対してS3バケットに対してのアクセス権限を要求
        • Lake Formation から取得したクレデンシャル(取得できる範囲を制限)を利用してS3のオブジェクトへリクエストを投げる
    • 監視&監査(ロギング)
      • アクセス要求や発生したポリシー例外を記録
      • アクティビティ履歴で変更ログやログデータの入手経路をレビュー
        • CloudTrail

 

  • Lake Formation AWS Glue の関係
    • Glue ETL(抽出・変換・ロード)を行うジョブとデータカタログを持つマネージドサービス
    • Lake Formation AWS Glue の拡張版とも言える
    • Lake Formation Glueとデータカタログを共有している
    • Lake Formation のジョブとクローラーGlue のジョブとクローラを呼び出している
    • セキュリティ強化やブループリントによるデータ取り込みなどでより便利にGlueの機能を使えるようになっている
  • AWS Glue からLake Formation への移行
    • AWS Glue ではアクセスの権限管理をIAMを介して行なっている
    • 対してLake Formation では自身で権限管理をしている
    • 移行の際にはアクセス許可モデルの移行が必要になる
    • IAMAllowedPrincipals という平行稼働時の運用をサポートするツール(移行後はOFFにすることを推奨)

 

## 雑感

後ろでAWS Glue を利用しているが、より一連の操作を行いやすくし、AWSでデータレイクを構築・運用するためのマネージドサービス。データのETL処理や権限管理をメインで行ってくれる。利用料金自体はかからず、分析サービスやデータストアの料金のみがかかる。シンプルになるのであればAWS Glue を利用すればいいが、そうではない場合はAWS Lake Formation を利用する感じだと思う。

一番のメリットは散らばりやすいIAMの管理がLake Formation にまとめられ、管理がしやすくなることだと思う(もしGlueをすでに利用している場合でも移行パスは提示されている)。また、ブループリントによりETL処理が楽になる部分があるかと思うが、(これ自体はGlueで提供されている機能かもしれないので)確認してみる。

テーブルレベルではなく、行単位で権限管理ができるのはすごいと思った。分析者に見てはいけないデータを見させないためのモノであるとは思うが、ちょっと権限管理が面倒になるかな、とも思った。

公式(モヒカン)漫画もあった。

aws.amazon.com

Amazon Managed Streaming for Kafka

# Amazon Managed Streaming for Kafka

https://d1.awsstatic.com/webinars/jp/pdf/services/20191120_AWS-BlackBelt_AmazonMSK.pdf

## Amazon Managed Streamingfor Apache Kafka(MSK)とは

  • フルマネージドで可用性が高く、セキュアなApache Kafka
  • 他のデータソースからデータを一時的にキューイングして他のサービスへ連携する
  • 分散データストリーミング・プラットフォーム

 

## Apache Kafka とは

  • 全体像
    • Kafka のクライアントとして、プロデューサーとコンシューマーが存在する
      • Pub: プロデューサー
        • トピックと値を指定してキューに値を送る
        • リーダーレプリカのみに書き込みを行う
      • Sub: コンシューマー
    • Kafka は複数のサーバーでクラスターを構成しており、スケーラビリティと可用性を確保している
    • コンポーネント
      • ブローカー
        • クラスターとして動作し、データの受配信を担う
      • トピック
        • メッセージを種別で管理する
      • パーティション
        • ブローカー上に分散配置され、トピックのメッセージが格納される
        • 冗長性確保のためにブローカー間でコピーされた複数のセプリカを構成する(リーダーレプリカと複数のフォロワーレプリカ)
        • リーダーレプリカに対して書き込みが行われる
        • フォロワーレプリカはリーダーレプリカに書き込まれた内容を複製する(リーダーは同期が取れているかを把握している)
        • コンシューマーのメッセージ読み込みもリーダーレプリカのみから行われる
      • オフセット
        • メッセージがパーティションに入れられた際に付与されるシーケンシャルな番号
        • パーティション単位で最初に取得したメッセージをZooKeeper もしくはKafkaが覚えていてくれる
        • どこまで読み出したかを管理することができる
      • ハイウォーターマーク
        • レプリカによる複製が完了済みのオフセット
        • コンシューマーはハイウォーターマークのデータのみ取得可能(=レプリカに複製済みのキューだけサブスクライバは取得できる)

 

## Amazon MSKの機能

  • Amazon MSK はコントロールプレーンの操作を提供
  • データプレーンの操作はApache Kafka APIをそのまま使用可能
    • トピックの作成や管理
    • プロデューサーからのデータの入力
    • コンシューマからのデータの取得
  • アーキテクチャ
    • Amazon MSK
      • Broker node
      • Zookeeper

 

Kafka on EC2 Amazon MSK を利用した場合の違い

  • Kafka on EC2
    • 自身で全てデプロイ
    • EBSまたはインスタンスストアにデータを保存
    • インスタンスタイプは任意のものを選べる
    • ネットワーキングは自身で設計
  • Amazon MKS
    • 複数AZに自動的にデプロイ
    • MSK管理下のEBS
    • M5
    • クラスタ内はマネージド。クライアントからはENI経由で接続
    • アップグレードはBlue/Green デプロイで行う。
      • シングルクラスタ構成
      • アクティブ・スタンバイ構成
    • パフォーマンスチューニングについてはKafka on EC2と違いはない
    • MSKによる監視
      • CloudWatch と連携
    • MSKのセキュリティ機能
      • 保存データ・通信データの暗号化
      • IAMによる権限管理
      • TLSクライアント認証
      • コンプライアンスの認証を取得
    • クラスタのバックアップ機能は未提供

 

## 運用

  • 構成管理
    • ブローカー・トピック・ZooKeeper のデフォルト構成を提供している
    • カスタム構成を作成することも可能
    • カスタム構成で既存のクラスタを更新することも可能
  • スケーリング
    • ストレージの拡張
    • ブローカー数の拡張
  • クラスタの耐障害性
    • 99.9%SLA
    • 障害が発生したノードはクラスタから切り離され、新しいブローカーに置換

 

Apache Kafka のベストプラクティス

https://aws.amazon.com/jp/blogs/news/best-practices-for-running-apache-kafka-on-aws/

 

Amazon MSKのベストプラクティス

  • クラスタを適切なサイズに設定する
  • ディスク容量を監視する
    • ディスクフルを防ぐ
  • Kafka の Data Retention パラメータを指定する
    • ディスクの空き容量を定期的に解放する
  • MSKの管理外にあるブローカーを追加しない
  • データ通信の暗号化を有効にする
  • パーティションの再割り当てを行う

 

## ユースケース

  • Amazon Kinesis との使い分け
    • Amazon MSK
      • Apache Kafka 互換
      • クラスタをプロビジョニング
      • シームレスなスケーリングが困難
      • オンプレミスからの移行が容易
        • Kafka MirrorMaker を利用してオンプレのKafka のデータをMSKにミラーできる
        • Kafka Connect を利用してKafka 周辺のシステムを接続できる
        • Schema Registry
    • Amazon Kinesis Data Streams
      • フルマネージドなサービス
      • 他のAWSサービスとの連携
      • スループットをプロビジョニング
      • シームレスなスケーリングが可能
  • Apache Kafkaユースケース
    • メッセージング
    • ウェブサイトのアクティビティ追跡
    • メトリクス
      • 分散したアプリケーションから運用監視データを集約して集計や統計処理を実施
    • ログの集約
      • ログのイベントデータをメッセージのストリームとして利用
    • ストリーム処理
    • イベントソーシング
    • コミットログ
  • Amazon MSK ユースケース
    • オンプレミスにある既存のApache Kafka クラスタの移行
    • 既存の自前で管理しているApache Kafka クラスタの移行
    • Apache Kafka の周辺ツールを利用している場合
    • それ以外の場合は基本的に Kinesis Data Streams が良い

 

## 雑感

基本的にはKinesis Data Streams を使うのが良さそう。ただ、既存のApache Kafka クラスタがあり、それを移行したい場合などにはAmazon MSK という選択肢が出てくる。

MSK自体はマネージドではあるが裏側にM5系のインスタンスがあるのでスケールやキャパシティやスケーリングに制限があるので最終的にはKinesis Data Streams に置き換えることを目指すのが良さそう。

Amazon EMR

# Amazon EMR

https://d1.awsstatic.com/webinars/jp/pdf/services/20191023_AWS-Blackbelt_EMR.pdf

## なぜAmazon EMR を利用するのか

  • 何が求められているか
    • 新たな非リレーショナルデータをペタバイト以上のスケールでリアルタイムにキャプチャして保存
    • バッチレポートだけではなく、リアルタイム、予測、音声、画像認識を組み込む新しいタイプの分析をする必要がある
    • 安全かつ管理された方法でデータへのアクセスを民主化する
  • 従来までの分析方法
  • Amazon EMRとは
    • マネージドなHadoop Spark
      • 最新のHadoop および Spark エコシステムのリリースをデプロイ
      • 任意のサイズに拡張可能
      • 高い可用性と耐久性
        • オートヒーリング
      • 高い安全性
        • 暗号化
          • 保管時の暗号化
          • 転送時の暗号化
        • Amazon Macie によるセキュリティ
        • VPCを利用したネットワーク分離
          • S3 Private Link で接続してよりセキュアに
          • パブリックアクセスをブロックするオプション(Block Public Access)
        • IAMポリシーとの連携
        • AWS CloudTrail
        • Kerberos サポートによるAD認証
        • Hadoop エコシステム機能による認証認可
      • RIを利用可能
        • 必要に応じてスケールさせることができ、コスト最適化を図れる
      • データはS3へ、コンピューティング部分と分けることで、用途に合わせたクラスタを立てることができる
    • 他のAWSサービスとの連携
      • Kinesis Connector
      • DynamoDB-connector for Hive
      • S3
      • Redshift-spark  connector

 

## Amazon EMR で何ができるのか

  • Amazon EMR クラスタへのjob の送信方法
    • Spark アプリケーションからAmazon EMR Step API 経由で送信
    • Lambda 経由で送信
    • ジョブ送信をスケジューリングしたり、パイプラインを構成して送信
  • AWS Glue データカタログを共通のメタデータストアとして適用できる

 

## どうやって利用するのか

 

  • クラスタを作成後でも、ソフトウエア設定を再構成して、実行中のクラスタ内の各インスタンスグループに設定を追加・更新することができる
  • Job 実行時の処理のステップを追加することが可能
  • 複数のtask グループを設定することが可能(task グループによってインスタンスファミリーを変更するなど)
  • オートスケーリングの設定
  • ロギング
    • デフォルトでマスターノードに書き込まれるログをS3に出力することもできる
    • デバッグオプション
  • EMRFS Consistent View
    • S3は結果生合成を持つので、一貫性がない場合に処理を再実行させることができる
    • DynamoDB をファイルレジストリとして使用し、矛盾の検出と処理の再実行を行う
  • カスタムAMI
    • ゴールデンイメージとして運用
  • 起動時の処理の追加
  • EC2キーペアを設定することでマスターノードにSSHできる
  • IAMの設定
  • 暗号化とセキュリティグループ
  • EMRノートブック
    • Jupyter ノートブックベースのツール
    • Hadoop, Spark およびLivy を実行しているEMRクラスタにアタッチすることで利用可能

 

## Amazon EMR とその他のサービスとの使い分け

  • Amazon Athena
    • 以下のケースに当てはまるなら Presto on Amazon EMR を利用するのが良い
      • RDBなどS3以外にもデータソースにする必要がある
      • Athena の同時実行クエリ数の制限を回避したい
  • AWS Glue
    • 以下のケースに当てはまるなら Apache Spark on Amazon EMR を利用するのが良い
      • ETL 処理にSpotインスタンスを利用したい
      • 単一のノードのスペックを高くしたい
      • ETL 処理にSpark 以外のアプリを使いたい
  • Amazon Kinesis Data Analytics for SQL/Java App
    • 以下のケースに当てはまるなら Apache Spark on Amazon EMR を利用するのが良い
      • ストリーミングアプリをより柔軟にカスタマイズしたい
  • Amazon DynamoDB

 

まとめると以下の場合にはAmazon EMRを利用するのが良い

  • Hadoop と各種アプリを柔軟にカスタマイズしたい
  • オンプレのHadoop クラスタをシンプルに移行したい
  • マネージドサービスの制限を回避したい
  • できるだけ新しいバージョンを利用したい
  • アプリケーションのバージョンを固定したい
  • 複数種類のアプリケーションを同一クラスタ上に稼働させて連携させたい

 

## 雑感

Amazon のマネージド MapReduce。大量のデータを処理するための分散処理基盤であるHadoop / Spark のマネージドサービス。分析するAWSのサービスは他にAmazon Athena Amazon Redshift があるが、これらはS3をデータソースとして分析するだけにとどまっているので比較的制限がある。それに対してAmazon EMR はより柔軟に大規模なデータを扱うのに適している。Amazon EMR で最初に処理を行った後にS3にストアしたデータを利用してAthena Redshift を利用するという組み合わせで処理を組むことも可能。

インターネットに露出しない仕組みや、IAM Hadoop そのもののセキュリティの仕組みを利用してセキュアに利用することもできる。

 

Q. Redshift EMR の使い分け

https://aws.amazon.com/jp/redshift/faqs/

Q. ビッグデータサービス(Athena, EMR, Redshift)との比較

https://aws.amazon.com/jp/athena/faqs/

Amazon Elasticsearch Service, Amazon CloudSearch

# Amazon Elasticsearch Service, Amazon CloudSearch

https://d1.awsstatic.com/webinars/jp/pdf/services/20200623_aws_blackbelt_amazon_es.pdf

https://d1.awsstatic.com/webinars/jp/pdf/services/20160323_AWS-BlackBelt-CloudSearch_AmazonES.pdf

## 全文検索とは

  • 検索エンジンの基礎-Apache Lucene
  • 検索と索引(インデックス)
    • 順次検索
      • Unixgrep のようなイメージ(上から全て見ていく)
      • 文書の量が膨大になると素早く結果を返すことが難しい
    • B-tree
      • RDBMSなどで使われるインデックス
      • データが格納されているブロックのポインタを索引で保持
    • 転置インデックス
      • 検索エンジンで使われるインデックス
      • Amazon CloudSearch / Amazon Elasticsearch Service 共に転置インデックスを作成
      • キーワードがどの文書に存在するかを索引付け
      • 表記揺れや類義語・正規化を補正する処理を追加してあげると精度が向上する

## Elasticsearch とは

  • ログ分析や検索に関する様々なスースケースで利用できる、分散型RESTful 検索/分析エンジン
  • コンポーネント
    • 可視化
      • Kibana
    • 分析/検索
      • Elasticsearch
    • 収集
      • Log stash
      • beats
  • データ挿入から活用までの流れ
    • JSON形式のデータをREST API 経由で送信
    • インデックスに収納された全てのデータが検索可能
    • REST API経由でクエリ
  • データの持ち方
    • 論理的なデータの持ち方
      • Index の中にDocument を持つ。Documentの中にフィールドとしてアイテムが格納される
    • 物理的なデータの持ち方
      • マスターノードとデータノードに分かれる
      • データノードではプライマリーシャードとレプリカシャードが作成され、可用性を向上させている

## Amazon CloudSearch 概要(2011-)

  • 自動拡張するフルマネージド検索サービス
    • Auto Scaling
    • Auto Partitioning
  • Apache Solr のマネージドサービス
  • Indexing
    • 全ての喉にELB経由で均等にアップロード
    • ファイルをS3に保存
    • メタデータDynamoDBに保存

 

## Amazon Elasticsearch Service の概要

  • 概要
  • 利点
    • フルマネージド
    • 柔軟性
    • コスト効率
      • RIも選択できる
    • 高可用性
      • セルフヒーリング
      • モニタリング
      • マルチAZ
      • 自動バックアップ
    • スケーラブル
      • スケール
      • バージョンアップ
      • パッチ適用
    • セキュア
      • VPC内へのデプロイ
      • Cognito によるログイン
  • API
    • 設定API
    • Elasticsearch API
      • Elasticsearch クラスタAPI
      • インデックス作成や削除、ドキュメントの追加、検索クエリの実行等の操作を行うためのもの
  • サポートするインスタンスサイズ
    • インスタンスサイズによって最大EBSサイズやHTTPリクエスペイロードの最大値がことなる
    • 世代が古いと古いESバージョンが利用できるが、データ暗号化や詳細アクセスコントロールが設定できないなど制約も多い
  • 推奨アーキテクチャ
    • ドメイン
      • ESクラスタのこと
      • 後からインスタンスタイプの変更やEBSの追加が可能
      • インターネットから直接アクセスできるタイプとVPC経由でしかアクセスできないタイプを選択可能
    • マスターノード
      • 専用のマスター3台以上で構成するのを推奨
    • マルチAZ
      • 可用性向上のためマスターノードとデータノードをそれぞれ別のAZに立てることを推奨

 

## ログ分析

  • データ投入
    • ログ分析の場合、Kinesis Data Firehose 経由でストリームデータを直接ESに入れるのが定番(別アカウントからのインプットにも対応)
    • CloudWatch Logs サブスクリプションにより、Lambdaを経由したストリームデータ投入も行える
    • Lambda等からElasticsearch Bulk API を叩いてS3のデータを定期的にインポートするといったことも可能
  • SQLインターフェースのサポート
    • 検索APIではなくSQLを使用したデータ分析が可能(JDBCドライバがある)
    • Kibana に対してSQLを発行
    • CLI からAmazon ESに認証付きでSQL クエリを発行することもできる
  • Ultrawarm ノード
    • 大規模ログ分析を低コストで実現するためのノードタイプ
    • S3に保持したデータに対してクエリを実行
    • 読み取り専用
  • クラスタ横断でのクエリ実行

 

## 検索

 

## 管理

  • Indes State Management(ISM) でインデックス管理の自動化
    • ISM機能により、日・週・月単位で新しく作られるインデックスの管理を自動化、従来Curator で行う必要があったものをAmazon ES 側で設定可能に
    • Kibana 上でインデックス管理ポリシーを設定・管理
    • _template API と併用することで新しいインデックスうにポリシーを自動で反映
  • ロギング
    • Elasticsearch API のログ
      • 以下をCloudWatchに出力
        • インデックススローログ(ドキュメントの追加・削除・更新)
        • 検索スローログ(検索クエリ)
        • エラーログ
      • デフォルトでは無効になっている
    • 設定APIのログ
      • APIコールのログをCloudTrailに出力
    • 検索APIベースのアラート
      • Elasticsearch のクエリを指定して、一定の閾値を超えた場合にアラートをあげることが可能
      • Slack 等に通知を飛ばす
    • Anomary Detection をトリガーにしたアラートの実行
  • 設定変更
    • ドメイン変更時にはBlue/Green デプロイによって行われる
    • 一時的に倍のノードになりデータノードとマスターノードに負担がかかる
    • 深夜帯に行うことを推奨
  • スナップショット
    • クラスターのバックアップ
      • 自動スナップショット
        • バックアップ
        • 1時間ごと14日間作成
      • 手動スナップショット
        • バックアップ / データ移行
        • S3にデータを保存するため料金に入れる

運用のベストプラクティス

https://www.slideshare.net/AmazonWebServicesJapan/20200414-amazon-elasticsearch-service-best-practice

 

## セキュリティ

  • 認証と認可
    • IAMベースのAmazon ESドメインに対するアクセスポリシー
    • Logstash AWSプラグインを利用することでAWSのクレデンシャルを利用してデータ投入できる
    • Open Distro ベースのドメインないサブリソースに対する詳細なアクセス権限管理
    • ユーザー
      • ES内部で管理
      • Cognito 連携
    • 詳細な権限管理
      • インデックスレベル
      • ドキュメントレベル
      • フィールドレベル
    • Kibanaのマルチテナンシー
  • 暗号化
    • 保管時のデータ暗号化
      • AWS KMSによる暗号化
    • 転送時のデータ暗号化
  • VPC からAmazon ES にプライベート接続

 

 

## Amazon CloudSearch Amazon ES の比較

  • CloudSearch
    • 検索エンジン
      • Solr
    • CloudSearch API を利用して検索
    • AutoScaling でスケールする
    • インスタンスストアにデータを保持するため大量データ保存は厳しい
    • ログの可視化はできない
    • リアルタイムデータ取り込みは制限がある
  • Amazon ES
    • 検索エンジン
      • Elasticsearch
    • 検索エンジンAPIを直接利用可能
    • 構成を後から変更することができない
    • EBSを選択可能なため大量のデータ保存もできる
    • Kibana でログを可視化
    • リアルタイムデータ取り込みが可能

 

http://dev.classmethod.jp/cloud/elasticsearch-service-vs-cloudsearch/

  • 決まった仕様のCloudSearch 高いカスタマイズ性のElasticsearch
  • 1対多のデータ構造対応ならElasticsearch
  • 運用で楽がしたい場合はCloudSearch

 

## 雑感

AWS のマネージドElasticsearchIAMによる制御に加え、OSS自体についている認証・認可の仕組みを利用して、ドメイン・ドキュメント・インデックスレベルで細かく制御をすることができる。

料金がノード間の転送料金はかからないが、Amazon ES からのin/out がかかるのでアプリの仕組みによってはお金がかかるようにも思える。

そもそも運用コストがElasticsearch が高いので、Amazon ESを利用することで運用コストをかなり減らすことができると思う。

それよりも仕様が決まっていて、運用で楽がしたいのであればCloudSearch を利用することが選択肢となると思う。

 

Amazon Kinesis

# Amazon Kinesis

https://d1.awsstatic.com/webinars/jp/pdf/services/20180110_AWS-BlackBelt-Kinesis.pdf

## Amazon Kinesis の特徴

  • 概要
    • ストリームデータを収集・処理するためのフルマネージドサービス群
  • 利用場面
  • ストリーミングデータの利用シナリオ
    • データの収集とETL
      • 配信や入札データの収集
      • 顧客行動データの収集
      • 運用のシステムメトリクスの収集
    • 継続的なメトリクス計算
      • コンバージョンレート/収益/カバレッジの計算
      • クリックレートの計算
      • PVの計算
      • システムログ分析
    • リアルタイム分析と応答
      • ユーザ行動に応じた配信・入札エンジンの最適化
      • 稼働状態予測あアラート・通知の発行
      • レコメンデーションエンジンの最適化
      • 異常検知

 

### Kinesis Streams

ストリームデータを処理するためのアプリケーションを独自に構築

  • アーキテクチャ
    • input
      • 認証・認可を経てデータをInput
      • たくさんのストリームデータがKinesis Streams
      • 3AZでの強い生合成でデータを複製
      • 順序つきのイベントストリームとして複数のアプリケーションから同時アクセス可能
    • Output
    • コンセプト
      • データの種類や用途に応じてストリームを作成。ストリームは1つ以上のシャードで構成
      • 保存されるデータの単位を「データレコード」と呼ぶ
      • 保存期間はデフォルトで24時間。最長7
      • 1データレコードの最大サイズは1MB
      • ストリーム内のシャード数を増減することでスループットをコントロール
      • データレコードの分散
        • データ入力時に指定するパーティションキーで保存先のシャードが決定
        • 分散して処理が可能に
      • 全てのデータレコードにはシーケンス番号(シャード内でユニーク)がアサインされ、順序が保証される
    • サポートするプロデューサー・コンシューマー
      • プロデューサー(送信側)
        • AWS SDK
        • Kinesis Producer Library (KPL)
          • Amazon Kinesis Streams にデータを送信するOSSの補助ライブラリ
          • Aggregation
            • 複数件のデータを1データレコードに集約して送信可能
          • Collection
            • 複数レコードをバッファリングして送信
        • Kinesis Agent
          • Amazon Kinesis サービスにデータを簡単に収集して取り込むスタンドアロンJavaアプリケーション
          • ファイルのローテート処理、失敗時の再試行、フォーマットの変換やログのパースなどの前処理をしてくれる
          • Cloudwatch へメトリクスを送信
          • Kinesis Streams / Kinesis Firehose のどちらへも送信可能
        • AWS IoT
        • Kinesis Log4j Appender
        • Fluentd
        • CloudWatch Events/Logs
        • Amazon Kinesis Data generator(KDG)
          • KDG を利用して、Amazon Kinesis Streams またはKinesis Firehose にテストデータを送信できる
      • コンシューマー(データ処理側)
        • Kisnesis Firehose
          • 直接ストリームデータを送信できる
          • Kinesis Firehose から見てデータソースをKinesis Streams しか設定できなくなるので他のデータはKinesis Streams から流すことになる
        • Get* API
        • Kinesis Client Library(KCL)
          • KCL を利用してKinesis アプリケーションを生成できる
          • クライアントライブラリ
          • ステート管理はDynamoDBを利用して行う
            • シャードとワーカーのマッピングを調整
            • 処理されたレコードのチェックポイントを作成
            • ワーカーインスタンスの増減やシャードの分割/結合に追従
        • Kinesis Analytics
        • AWS Lambda
        • Amazon EMR
        • Apache Storm

 

 

### Kinesis Firehose

ストリームデータをAmazon S3, Amazon Redshift, Amazon ESへ簡単に配信

データストアとダイレクトに統合

サーバレスETL

  • コンセプト
    • 配信先に応じて「配信ストリーム」を作成
    • シャードの作成やパーティションキーの指定は不要
    • 制限なしにスケール
    • 1データレコードの最大サイズは1MB
  • 連携
    • Lambda で変換を挟みつつ、データを後続に流す
    • Amazon S3
    • Amazon Redshift
    • Amazon Elasticsearch Service

 

### Kinesis Analytics

ストリームデータを標準的なSQLクエリでリアルタイムに分析

  • コンセプト
    • 分析単位に「アプリケーション」を作成し、入出力となる「ストリーミングソース/ディスティネーション」を設定
    • SQLクエリ実行の前処理としてLambda 関数を指定可能
    • クエリの複雑さとデータのスループットに応じてKPU(Kinesis Processing Units) を設定
    • Kinesis Streams / Firehose -> 入力ストリーム ->  Lambda -> SQL -> 出力ストリーム -> Kinesis Streams / Firehose
    • 様々なタイムスタンプを利用して処理
    • タンブリングウィンドウ/ スライディングウィンドウ を指定して問い合わせ
    • CloudWatch によるアラート
    • 参照テーブルの結合

 

## Amazon Kinesis の適用例

  • ユースケース1
    • Data producer から Kinesis Firehose にデータを送り込む
      • Lambda 経由でAmazon ES にデータを送りKinabaで可視化
      • S3に送り、Amazon Athena で仮説検証
      • 既存のS3 のデータと組み合わせてKinesis Analytics で分析、それをKinesis Streams に送りLambda 経由でSNS で送信まで行い処理を自動化
  • ユースケース2
    • Lambdaを利用したスピード優先の処理
    • Redshift EMRを利用したBatch 処理での分析
  • ユースケース3
    • IoTと組み合わせたセンサーデータの収集と前処理

 

## 雑感

ストリームデータの受け取り、Lambda と連携した処理、データ受け取り後に他のサービスに流す処理を行うサービス。大量のデータを受け取り、分析がしやすい状態に加工して、本職のサービスが利用しやすい状態にすることがメインになる。

大量なデータを受け取ってもフルマネージドで無制限のスケールなので心配する必要がない。

 

Kinesis Data Streams SQSの違いは

SQSはシンプルにキューイングしてコンシューマーはそれを取り出してキューから削除するが、Kinesis は大規模なストリーミングをリアルタイムに処理したり、レコードを数時間後に同じ順序で提供したい場合などで利用される。これはTTL時間の差やレコードのサイズの差にも表れている。

https://aws.amazon.com/jp/kinesis/data-streams/faqs/

Amazon Athena

# Amazon Athena

https://d1.awsstatic.com/webinars/jp/pdf/services/20200617_BlackBelt_Amazon_Athena.pdf

## Athena とは

Amazon S3 にあるデータ(または様々なデータソース)に対してSQLを使用して簡単に分析可能とするインタラクティブなクエリサービス

 

  • 特徴
    • マネージドサービス
    • 大規模データに対しても高速なクエリ
    • S3に対して直接クエリ
    • スキャンしたデータに対しての従量課金
    • JDBC/ODBC/API経由でBIツールやシステムと連携
  • ユースケース
    • シンプルにS3に対してクエリを発行して分析
    • ログ分析
      • S3に出力される様々なAWSサービスのログや収集データに対してクエリ
      • ETL (Extract/Transform/Load)パイプラインをAthena で構築

 

## Athena の使い方

  1. データをS3に保存する
    • Database Migration Service
    • Kinesis Data Firehose
    • Kinesis Data Streams
    • S3
    • Storage Gateway
    • Snowball / Snowball Edge / Snowmobile
    • DataSync
    • AWS Transfer Family
  2. テーブルを定義する
    • Athena ではクエリのためにテーブル定義が必要
    • デフォルトでAWS Glue Data Catalog 状のテーブル定義を使用
    • HiveQL形式でDDLを記述
    • データソース
      • データを記述するデータカタログとデータを合わせてデータソースと呼ぶ
      • デフォルトのデータソースはAWS Glue Data Catalog
    • すでに既存の仕組みがあり、Hive Metastore を持っている場合にはこれに対してAthena を接続できる
  3. クエリを実行する
    • 標準SQLに準拠したクエリ
    • 行単位でのトランザクションではなく、あくまでデータ抽出や集計がメインの用途
    • クエリ結果はS3バケットに自動的に保存
    • クエリ履歴を確認することも可能
    • JDBC/ODBCドライバー経由のクエリ
    • Athena API 経由
    • Athena のクエリパフォーマンスの基本
      • スキャンデータの総量を減らす
      • スキャンするファイルを一定サイズ以上以上にまとめる
        • 小さいファイルが多いとオーバーヘッドが大きくなる
        • 128MB以上の塊にまとめる
      • スキャンするファイルを分割可能な形式とする
        • 複数ワーカーで並列して処理を行える

 

## Athena の様々なクエリ

  • CTAS(Create Table As Select)
    • クエリ結果をもとに新しいテーブルを作成
    • ETL処理をAthena で実行可能
      • データを圧縮フォーマットに変換
      • データを複雑に加工整形するための多段クエリ
    • パーティショニングとバケッティング
    • INSERT INTO
      • クエリ結果をもとに、既存のテーブルにデータを追加
        • 実行のたびに新しいファイルが生成されるため、少量データでの実行を繰り返すことで、大量の小さなファイルが生成されクエリパフォーマンスに影響
      • パーティション追加
    • VIEW
      • クエリ自体を仮想的なテーブルとして登録
      • 活用シーン
        • データのサブセットをクエリする
        • 複数のテーブルを1つのクエリに結合する
        • 既存の基本クエリの複雑性を解消して、ユーザーによるクエリの実行を単純化する
        • クエリ問い合わせのインターフェースとして利用し、クエリ仕様変更に対する影響を最小限にする
    • 地理空間データ分析
    • 変数(SELECT $path, WHERE $path)
    • LIKE 句やWhere 句で利用
    • Amazon Athena Federated Query
      • 様々なデータソースに対してSQLクエリを実行可能
      • AWS Lambda で動作するコネクタを利用して実行
      • 標準コネクタ
      • Athena Query Federation SDK を利用して、独自コネクタを実装可能
    • User Defined Function(UDF)
      • ユーザ独自のスカラー関数をUDFとして定義してSQLクエリで呼び出すことが可能
      • データの圧縮・解答、機密データの編集、カスタマイズされた復号の適用など独自の処理を実行可能
      • Java で実装し、Lambda関数としてAthena から呼び出される
    • Machine Learning(ML) with Amazon Athena
      • Athena SQL クエリでSageMake MLモデルを呼び出し、推論を実行可能

 

## フォマンスチューニング

### データ最適化

  • 列指向フォーマットにする
    • Online Analytical Processing 向き
    • 特定の列をまとめて保持
    • 特定の列だけを扱う処理では、ファイル全体を読む必要がない
    • メリット
      • OLAP 系の分析クエリを効率的に実行できる
      • 単純な統計データならメタデータで完結する
      • IOの効率が上がる
  • データ圧縮
    • 最低限分割可能な圧縮形式を利用しておくことで分散処理をすることが可能

 

### データレイアウトの最適化

  • パーティションを利用する
    • S3 オブジェクトのキーを構成をCREATE TABLE に反映
    • Where句で絞った時に LOCATION S3のパスを指定し該当ディレクトリだけを読み込む
  • Partition Projection
    • 概要
      • 非常に多くのパーレィションがあるテーブルにたいするクエリ処理を高速化し、パーティション管理を自動化することが可能
      • パーティションプルーニングでメタデータを利用して、クエリに適用されるパーティションにだけ処理を実行することで高速化を図れる。
      • しかし、テーブルに非常に多くのパーティションがある場合AWS Glue Data Catalog に対するパーティション取得APIの呼び出しがクエリパフォーマンスに影響する可能性が生じる
      • Partition Projection を利用するとパーティション情報をAthenaが計算できるようになるため(AWS Glue Data Catalog を経由しないため)クエリ高速化の恩恵を享受できる
    • ユースケース
      • 非常に多くのパーティションがあるテーブルに対するクエリが遅くなってきた場合
      • 定期的にパーティションをテーブルに追加している場合
      • 非常に多くのパーティション化されたデータがS3に保存されていて、メタデータストアで管理するのが現実的ではなく、クエリで参照する対象のデータがほんの一部の場合

 

### クエリの最適化

  • LIMIT を利用してORDER BY を最適化
  • JOINの順番を工夫する
  • GROUP BYの工夫
  • LIKE演算子を利用する際にはregex に置き換えて実行する
  • (多少の誤差を許容できる場合)近似関数を利用する
  • 必要なカラムだけを読み込む

 

 

## Athena の運用管理

  • Workgroups を利用した利用量・コストの管理
  • EventBridge を利用したクエリ監視
  • CloudWatch メトリクスの利用
  • CloudTrail を利用した利用状況のロギング

 

## Athena のセキュリティ

  • 保管時の暗号化
  • 転送時の暗号化
  • AWS Lake Formation によるFine Grained Access Control
    • シンプルな権限のGrant / Revoke
    • データカタログのデータベース・テーブル・列に対して権限を指定可能
    • 全てのデータアクセスを一箇所で監査
  • AWS Glue Data Catalog のリソースベースポリシー
    • IAM との連携
      • AWS Glue Data Catalog
      • S3
  • VPC エンドポイント

 

## 雑感

Athena Redshift SQLを発行できる、列指向(がメイン)として利用されるので競合に当たるものだと思う。Athena はフルマネージド、Redshift はマネージドだがクラスタを用意しないといけない点で異なる。イメージとしてはアドホックに利用したい場合や既存のあるデータが対応している場合に利用してみるかという感じ、Redshift はそもそもデータから何かを生み出すように設計して運用される場合に利用されるイメージ。

AWS WAF

# AWS WAF

https://d1.awsstatic.com/webinars/jp/pdf/services/20200324_AWS_BlackBelt_AWS_WAF_Update.pdf

## WAFとは

Web Application Firewall

ウェブアプリケーションの通信内容を検査し、不正なアクセスを遮断するルールセットを持つセキュリティ対策

 

## WAF の対応する範囲

  • 攻撃手法
    • DDos
      • CloudFront
      • ELB
      • AWS Shield
    • Application Attacks
      • <- WAFはここ
    • Targeted attackes
  • WAFがしていること
    • WAFは悪用する能力を制限するもの
    • 様々なHTTPのリクエストパターンを検証
    • 攻撃の変化に対応するためにルール構成を迅速に変更する機能

 

## WAF の機能

  • 機能
    • 悪意のあるリクエストのブロック
      • SQLインジェクション
      • XSS
      • AWSまたはパートナーのマネージドルール
    • カスタムルールに基づいたWebトラフィックのフィルタ
      • Rate-based rules
      • IP&Geo IP filter
      • 正規表現
      • サイズ制限
      • アクションの許可・拒否
    • モニタリングとチューニング
      • Amazon CloudWatch
      • メトリクス・アラーム
      • Log
      • 検知

 

## WAFの変更点

  • 2019.11 WAFv2になり、v1 WAF classic となった
  • ルールの記述タイプが統一
    • より柔軟に表現も可能に
  • WAF Capacity Unit が上限
    • それぞれのルールの中身に応じて処理コストを計上、その合計がWeb ACL Capacity を超えない範囲でルールを登録可能
    • 上限は1500
  • ビルトインのマネージドルール
  • AWS WAF Full logs の拡張

 

## WAF の詳細

  • WAF コンポーネント
    • Web ACL
      • ルールベースでリクエストの処理方法を指定
      • Web Capacity Unit(WCU)が上限
    • Rules
      • リクエストに対する検査方法(Statement)と、リクエストが検査条件に一致した場合の処理(Action)を定義
    • Statement
      • ステートメントで定義可能な条件
        • リクエスト元の国
        • 送信元IP
        • サイズ
        • SQSインジェクション攻撃か
        • XSS
        • 文字列が一致しているかどうか
        • 正規表現に一致しているかどうか
    • Rate-based rule
      • 5分間あたりの同一IPからのリクエスト数で閾値を超えたらBlock する
      • 対象とするリクエストも指定可能
    • Actions
    • Managed Rule
      • AWS Managed Rules for AWS WAF(AMR)
      • AWS WAF に組み込み可能なビルトインルールセット
      • 追加費用は不要(WCUは消費する)
    • Rule Group
      • 複数ルールを組み合わせたものを自分で作成可能
      • 優先度を設定でき、グループないの個別ルールアクションをオーバーライドすることが可能
      • ルールグループを作成する際には予約するWCUの値を決めておかなければならない
    • AWS リソース
    • レポート
    • AWS WAF Full logs

 

## WAF を利用した多段防御

User - AWS Shield - Route53 - (WAF - CloudFront) - WAF - ELB - EC2

というように複数箇所の前段にWAFを置くアーキテクチャ

 

## ログとモニタリング

  • モニタリング
    • CloudWatch との連携
    • サンプルリクエストからリクエスト内容の詳細(ソースIPURI、リクエスBodyなど)を確認可能
  • AWS WAF Full logs
    • Kinesis Data Firehose を介して、指定した宛先にJSON形式でログを送出
    • ブロックされた理由を確認可能
    • センシティブな情報は除外することも可能
  • Elasticsearch Kibana によるログ分析
  • カスタムエラーページ
    • CloudFront と連携させて設定可能
  • パートナーマネージドルール

 

## WAF 利用のための考慮事項

  • ルールポリシー
    • ブラックリスト
      • デフォルトのアクションは許可
      • ルールに合致した不正なリクエストをブロック
    • ホワイトリスト
      • デフォルトのアクションはブロック
      • ルールに合致したリクエストを許可
      • 限られた利用者がアクセスするケース
  • ルールの運用
    • セルフサービス
      • テンプレートなどを利用してルールを構築
      • ログの分析やルールのアップデートを継続実施
      • 誤検知が発生した場合はルールの見直しを自身で実施
    • マネージド
      • AWSまたはパートナーのAWS Managed rules for AWS WAF を利用
      • アップデートは提供元に任せる
      • 誤検知した場合は、自分で部分的にトラフィックを流す設定を追加して通すようにする
  • 導入ステップ
    • Count モード
      • 開発環境等でテスト
      • 誤検知が発生していないかサンプルリクエストレポートで確認
      • CloudWatch メトリクスでルールを評価
      • Full Logを確認
    • Block モード
      • 誤検知がないことを確認後、Blockモードへ変更
      • ルールごとにd三回的にBlockモードへ変更することも可能
      • サンプルリクエストレポートで確認
      • Block されたリクエストはFull log WebACLsルールにマッチした内容を確認できる
  • 連携

 

## 雑感

AWS のマネージドWeb Application Firewall。構成のところで確認したが、アーキテクチャの一番前段にはAWS Shield が入り、その後ろで多段で利用されるイメージ。

どのトラフィックを通すのか、どのくらいの連続したトラフィックを悪意のあるトラフィックとして遮断するかを柔軟にWCUの範囲内で設定することができる。

JSONで設定を管理することができるのでVCSで管理を用意にしやすいし、APIで管理できるので運用にも乗せやすそう。1ルールあたり1$かかるので、効率的にルールを決めて悪意のある攻撃を遮断できるように設計する必要がある。