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$かかるので、効率的にルールを決めて悪意のある攻撃を遮断できるように設計する必要がある。

AWS Shield

# AWS Shield

https://d1.awsstatic.com/webinars/jp/pdf/services/20170718_AWS-BlackBelt-Shield.pdf

## DDos 対策

DDos とは: Distributed Denial Of Service(ネットワークを通じた攻撃手法の一種で、標的となるコンピュータに対して複数のマシンから大量の処理負荷を与えることでサービスを機能停止状態へ追い込む手法のこと)

 

  • ユーザーができるDDoS対策
    • 攻撃対象領域を削減する
    • スケールして攻撃を吸収できるようにする
    • 公開されたリソースを保護する
    • 通常時の動作について学習する
    • 攻撃に対する計画を作成する
  • AWSには標準でDDoS防御が組み込まれている
    • AWSのグローバルインフラストラクチャに統合
    • 外部ルーティングなしで常時ON、高速
    • AWSデータセンターで冗長インターネット接続
  • セキュリティの脅威タイプ
    • DDoS(AWS Shield)
    • Application Attacks(AWS WAF)
    • Bad Bots(AWS WAF)

 

 

## AWS Shield とは

AWS Shield DDoSに対しての対策を行ってくれる

 

  • 種類
    • Standard Protection
      • 全てのAWSユーザに適用
      • 無料
    • Advanced Protection
      • より大規模な、より洗練された攻撃からの防御を提供する
      • 有料のサービス
  • AWS Shield Standard
    • Layer 3/4 Protection
      • 一般的な攻撃からの防御
      • 自動検知&自動緩和(DDoSのアクセスを90%以上軽減)
      • AWSサービスにビルトイン済み
      • CloudFront, Route53エッジロケーションの前にインラインで配置されて全てのパケットはAWS Shield を通るようになる
    • Layer 7 Protection
      • Layer 7 DDoS攻撃への緩和はAWS WAFで行う
      • セルフサービス
  • AWS Shield Advanced Protection
    • 対象サービス
      • CLB
      • ALB(インクルードされているWAFによる対応)
      • CloudFront(インクルードされているWAFによる対応)
      • Route53
    • DDoSへの対策
      • DDoS Response Team
      • L7 DDoS Protection
        • AWS WAFによる保護
      • Cost Protection
        • DDoS 攻撃によるスケーリングコストを回避
      • Advanced Mitigation
        • DDoSトラフィックを軽減してくれる
        • DDoS Response Team が手動でセットアップしてくれる部分もある
        • L3/4での軽減
        • L7 での軽減
          • カスタムルールによるWebトラフィックフィルタ
          • 悪意のあるリクエストのブロック
          • アクティブな監視とチューニング
      • Reporting
        • CloudWatch を経由してリアルタイム通知
        • ニアリアルタイムメトリクスと攻撃のフォレンジクスのためのパケットキャプチャ
        • 時系列の攻撃レポート
    • Operation
      • Self-Service
      • DDoS エキスパートによる対応
      • 積極的なDDos Response Team の関与

## AWS Shield オペレーションとは

  • AWS Shield Advanced を利用するまでのステップ
    1. IAMユーザーの準備
    2. AWS Shield Advanced の設定
      1. Shield Advanced を有効化(30*最低12ヶ月の料金)
      2. AWS リソースにAWS Shield Advanced 保護を追加する
      3. ルールとウェブACLを作成する権限をDRTに付与
      4. AWS WAF セキュリティ自動化をデプロイ

 

## AWS DDoS Shield の使い分け

  • Standard Protection
  • Advanced Protection
    • 大規模な攻撃に対する防御
    • 攻撃に対する可視性
    • 複雑なケースでのDDoSエキスパートによるサポート

 

## 雑感

AWS DDoSに対する防御と検知を提供するサービス。基本的なDDoSは無料で組み込まれているので十分と言えそうだが、より高度な攻撃に対応したい場合や、サポートが必要な場合はAdvanced Protection を入れる感じになる。とはいえ、月30万 で一年間利用をコミットしないといけないので判断はする必要がある。

AWS Sheild Advanced Protection にはWAFが付属していてこれによりDDoSだけではなくApplication Attack Bad Bots への対策にもなる。AWS Shield 自体は対応するリソースの前段で動き、悪意のあるトラフィックを検知・軽減してくれる。

AWS Directory Service

# AWS Directory Service

https://d1.awsstatic.com/webinars/jp/pdf/services/20151021_aws-blackbelt-directory-service.pdf

## ディレクトリとは

  • ユーザに関わる各種情報を保管する仕組み
    • ユーザー名
    • 姓・名・部署・電話番号
    • メールアドレス
    • グループ
    • パスワードなど
  • ツリー状の構成をすることからディレクトリと呼ばれる
  • LDAPADOpenLDAP

 

 

## AWS Directory Service

 

## AWS Management Console との認証フェデレーション

  • Active Directory フェデレーションサービス(ADFS
    • SSOの提供
  • AC Connector によるフェデレーション
    • ADユーザーはaccess URL 経由でコンソールにログイン
    • MFAを設定できる
    • ログイン先からさらにクロスアカウントアクセスでSwitch Role できる

 

## AWS アプリケーションとの連携

 

## 雑感

AWSAD統合サービス。フルマネージドなSimple AD か、AD Connectorで既存のADと連携させるかを選べる。社内システムやアプリケーションをSSOで管理できるようになり、セキュリティや効率が上がる。Linux の場合でもツールをインストールすることによってADドメインに入ることができる。

Azure AD と競合している。Azure AD AWS Single Sign-On AWSアクセス許可を一元管理することができる。Azure AD は標準の規格に加えて様々なカスタマイズができるようになっているようなので、シンプルに運用してAWSに寄せたいのであればAWS Directory Service 、それ以上に柔軟に設定・運用したい場合はAzure AD が選ばれるのではないかな。