コンサルでデータサイエンティスト

仕事でPythonを書いてます。機械学習、Webマーケティングに興味があります。趣味は旅です。

Amazon Location APIとPythonを使って住所を緯度経度に変換する

位置情報系の分析をしていると、店舗などの住所情報を緯度経度に変換したいケースがあるかと思います。今回は2020年12月にリリースされたAWSの位置情報サービスであるAmazon LocationをPythonから操作することでテキストの住所から緯度経度情報を取得してみました。

Amazon Locationとは

Amazon Locationとは、2020年12月にリリースされたAWSの位置情報サービスです。Amazon Locationは現時点(2021.03)では以下4つの機能を使うことができます。

  1. Maps
  2. Place indexes
  3. Geofence collections
  4. Trackers

f:id:hktech:20210309003403p:plain


実際にAmazon Locationのコンソール画面で見るとこのような形で上記の機能を画面上で試すことができます。
東京スカイツリーと打つと、東京スカイツリーの場所がマップ上で表示されています。
f:id:hktech:20210309004015p:plain


今回はこちらのPlace index上でクエリを投げて緯度経度を返す処理を、APIを通して実行してみました。

Amazon Location API

今回はAWSで用意されているSearchPlaceIndexForText APIを使って、テキストから緯度経度を取得します。
SearchPlaceIndexForText - Amazon Location Service Places

主なパラメータは以下です。

  • BiasPosition: 基準とする緯度経度を渡すことで、その位置から近い結果を返してくれる。クエリが曖昧な場合に有効
  • FilterBBox: 検索範囲のバウンディングボックスを緯度経度で指定可能
  • FilterCountries: 検索対象の国を指定。日本ならば 'JPN'
  • MaxResults: APIが返す検索結果の最大件数を指定
  • Text: 緯度経度を取得したいテキストを指定。住所や建物名など

Amazon Location APIPythonのboto3で操作する

APIPythonで操作します。今回はboto3というライブラリでAmazon Location APIにリクエストを投げてみます

まずはboto3をインストール

pip install boto3


AWS CLIのインストールがまだの方はこちら


それでは実際にboto3を使ってAPIにリクエストを投げていきます。今回はクエリとして東京スカイツリーの住所を指定します。

import boto3
client = boto3.client('location')

response = client.search_place_index_for_text(
        FilterCountries=[
            'JPN',
        ],
        IndexName='explore.place',
        MaxResults=1,
        Text='東京都墨田区押上1丁目1−2'
    )

以下のようなエラーが出た場合はIndexNameがうまく設定できていない。下記画像を参考に、Place Indexの名前を追加してあげれば問題なく動く。

ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the SearchPlaceIndexForText operation: resource[explore.plce] not found, reason: resource not found


f:id:hktech:20210309011933p:plain


レスポンスとしては下記のような結果が返ってくる。

{'ResponseMetadata': {'RequestId': '4f80ae56-2ee8-4559-99c1-34b6b32da5ef',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'date': 'Mon, 08 Mar 2021 16:37:25 GMT',
   'content-type': 'application/json',
   'content-length': '448',
   'connection': 'keep-alive',
   'x-amzn-requestid': '4f80ae56-2ee8-4559-99c1-34b6b32da5ef',
   'x-amzn-remapped-x-amzn-requestid': '4f80ae56-2ee8-4559-99c1-34b6b32da5ef',
   'access-control-allow-origin': '*',
   'x-amz-apigw-id': 'b4He5EiOtjMFX3A=',
   'access-control-expose-headers': 'x-amzn-errortype,x-amzn-requestid,x-amzn-errormessage,x-amzn-trace-id,x-amzn-requestid,x-amz-apigw-id,date',
   'x-amzn-trace-id': 'Root=1-604652c5-5af5c3456fb37df104aef536'},
  'RetryAttempts': 0},
 'Results': [{'Place': {'AddressNumber': '2',
    'Country': 'JPN',
    'Geometry': {'Point': [139.80945027424463, 35.71003896450161]},
    'Label': '東京都墨田区押上1-1-2',
    'Neighborhood': '1',
    'PostalCode': '1310045',
    'Region': '東京都'}}],
 'Summary': {'DataSource': 'Esri',
  'FilterCountries': ['JPN'],
  'MaxResults': 1,
  'ResultBBox': [139.80945027424463,
   35.71003896450161,
   139.80945027424463,
   35.71003896450161],
  'Text': '東京都墨田区押上1丁目1−2'}}


Geometryと記載がある箇所に位置情報が入っているので、緯度経度を取得したい場合は下記のように書くと取得可能

response['Results'][0]['Place']['Geometry']['Point']
[139.80945027424463, 35.71003896450161]

位置も合っていることを確認(住所の範囲により、多少ずれるのは住所からの変換による限界)
f:id:hktech:20210309014447p:plain



Amazon Location APIの料金について

Amazon Location APIの特徴として、極めて安価という点があります。1000件あたり$0.5なのでGoogle Maps PlatformのAPIと比べて10倍安い計算になります。これはAWS一択ですね。

f:id:hktech:20210309012857p:plain

f:id:hktech:20210309012950p:plain


まとめ

最近リリースされたAmazon Location APIPythonから操作してみました。いろいろな例で試してみましたが、住所からの検索であればほぼ正確な位置情報を取得することができるため、Google Maps APIの代わりとして使えそうです。位置情報の分析をしている方はぜひ使ってみてはいかがでしょうか。

【AWS ソリューションアーキテクト試験用まとめ】AWSオートスケーリング

はじめに

AWS 認定ソリューションアーキテクトプロフェッショナル(SAP)試験の勉強に向けた頭の整理として、以下の内容について用語レベルでまとめていきます。
勉強の進捗に合わせて記事の内容をアップデートする場合があります。

※この項目分類については、UdemyのUltimate AWS Certified Solutions Architect Professional 2020コースを参考にしています。

f:id:hktech:20201206010537p:plain

AWSオートスケーリングとは

  • AWSオートスケーリングとは、アプリケーションを監視に応じて自動でリソースを調整する機能。
  • EC2, ECS, DynamoDB, Auroraのレプリカなどのサービスのスケーリングに活用可能。

オートスケーリングポリシー

  • シンプル/ステップスケーリング:Cloud Watchのメトリック監視に連動してインスタンスを増加・減少させる
  • ターゲットトラッキング:メトリックと値を設定することで、平均CPU使用率を40%に維持・リクエストカウントを一定にするなどのカスタムスケーリング設定が可能。

RAMを指標としたスケーリングを実施したい場合はカスタムCloudWatchメトリックの設定が必要。

オートスケーリングのプロセス

オートスケーリングにより下記の操作を自動化可能

  • Launch:EC2インスタンスをグループに追加する
  • Terminate:EC2インスタンスをグループから削除する
  • HealthCheck:インスタンスの状態をチェック(EC2 or ELBヘルスチェック)
  • ReplaceUnhealthy: Unhealthyなインスタンスを停止し再作成
  • AZRebalance: AZ間のインスタンス数を均等化する
  • AlarmNotification: CloudWatchからの通知を受け取る
  • ScheduledActions: スケジュールに応じた操作を行う
  • AddToLoadBalancer: インスタンスをロードバランサまたはターゲットグループに追加



【AWS ソリューションアーキテクト試験用まとめ】Amazon EC2

はじめに

AWS 認定ソリューションアーキテクトプロフェッショナル(SAP)試験の勉強に向けた頭の整理として、以下の内容について用語レベルでまとめていきます。
勉強の進捗に合わせて記事の内容をアップデートする場合があります。

※この項目分類については、UdemyのUltimate AWS Certified Solutions Architect Professional 2020コースを参考にしています。

f:id:hktech:20201206010537p:plain

Amazon EC2とは

  • Elastic Compute Cloudの略
  • AWSの仮想サーバ構築サービス

EC2のインスタンスタイプ

  • R: RAMを多用するアプリケーションで活用。インメモリ処理の多いEMRのコアノードなどで使用
  • C:高機能CPUを活用するアプリケーションにて利用。
  • M:汎用的なアプリケーションにて使用。ウェブアプリなど
  • I:I/O処理が多いアプリケーションにて活用。データベースなど
  • G:GPUを活用するアプリケーションにて活用。ディープラーニングなど
  • T2/T3:バースト可能なインスタンス
  • T2/T3 unlimited: バースト上限がないインスタンス

EC2プレイスメントグループ

インスタンスをグループ化する仕組み。プレイスメント戦略として3つある。

インスタンスをプレイスメントグループに適用・解除する場合、先にインスタンスを停止してからCLIでの操作が必要となる。

EC2インスタンス起動タイプ

  • オンデマンドインスタンス:信頼性が高いが、高価
  • スポットインスタンス:安いがオンデマンドインスタンスのリソースが優先されるため、落ちる可能性あり
  • リザーブインスタンス:長期で契約することで割引がある。時間や期間指定での契約も可能 
  • Dedicated Instances: ハードウェアを占有する
  • Dedicated Hosts: 物理サーバごと占有可能。CPUレベルの制御やライセンス固定などが可能な点以外はDedicated Instancesと同等

EC2 メトリック

  • CPU:CPU使用
  • ネットワーク:ネットワークI/O
  • ステータスチェック:VMの状態を示すインスタンス状態とハードウェアの状態を示すシステム状態がある
  • ディスク:ディスクの読み書き(インスタンスストアがあるEC2のみ)

※RAMはメトリックに含まれない。

EC2インスタンスリカバリ

スポットインスタンス

  • スポットインスタンスはオンデマンドインスタンスに比べて最大で90%の割引が適用される
  • 最大スポット価格を指定することで、スポット価格が高い場合はインスタンスを停止するなどの処理が可能
  • データ分析や失敗が許容されるバッチジョブなどで活用

スポットブロック

  • スポットブロックとは、スポットインスタンスのリクエスト時に1-6時間の使用予定期間を指定し、落札に成功すれば指定した時間内はターミネートされず、落札価格が維持される仕組み。

スポットフリート

  • スポットフリートとは、スポットインスタンス(オンデマンドインスタンスもオプションで追加可)のコレクションであり、上限金額の中で指定した容量ターゲットを満たすようなインスタンス数を維持する仕組み。
  • 複数のインスタンスタイプを同居させることが可能。
  • EC2, オートスケーリンググループ、ECS、AWS Batchに対応



【AWSソリューションアーキテクト試験用まとめ】セキュリティ

はじめに

AWS 認定ソリューションアーキテクトプロフェッショナル(SAP)試験の勉強に向けた頭の整理として、以下の内容について用語レベルでまとめていきます。
勉強の進捗に合わせて記事の内容をアップデートする場合があります。

※この項目分類については、UdemyのUltimate AWS Certified Solutions Architect Professional 2020コースを参考にしています。

f:id:hktech:20201206010537p:plain

AWS Cloudtrail

  • コンソール・SDKCLIAWSサービス上で行われたイベント履歴、API呼び出し履歴を取得可能。ログはCloudWatch LogsやS3に格納可能。
  • 過去90日の履歴を表示可能。
  • CloudTrailからS3への格納はSSE-S3(デフォルト)やSSE-KMSなどで暗号化可能。また、直接SNSへの連携が可能。
  • マルチアカウントやマルチリージョンから1箇所へのログ集約を考える場合はS3バケットポリシーの設定が必要。
  • CloudWatch Logsに連携したログはメトリックフィルタを使うことでアクションを検知可能。
  • 最速でイベント検知をしたい場合はCloudWatch Eventsが有効。

KMS

  • KMS(Key Management Service)はAWSが提供する暗号化サービスである。IAMポリシー及びキーポリシーによって許可されたユーザがAPIによりデータを暗号・復号化することが可能。
  • KMSではCMK(Customer Master Key)をキーとして暗号化が行われる。このキーはユーザ側で取得することはできず、KMSにて管理される。CMKの種類としてはAWS Managed KeyとCustomer Managed Keyの2種類がある。前者は、S3・EBS・Redshiftなどで使われるAWS管轄のキーであるのに対して、後者はユーザ側で作成・管理・適用が可能なキーである。
  • KMSは呼び出しごとに4KBまでのデータしか暗号化することができない。それより大きい容量のデータを暗号化したい場合は、Envelope Encryptionを活用する。

AWS Parameter Store

  • 設定と機密を管理するための安全な階層型ストレージ。
  • パスワード、データベース文字列、Amazon マシンイメージ (AMI) ID、ライセンスコードなどのデータをパラメータ値として保存可能。KMSによって暗号化した形で保持可能。

Secrets Manager

  • 各リソースやアプリケーションにアクセスするための機密情報を管理するためのマネージドサービス。
  • Lambdaで定義することにより、任意の日数ごとに機密情報のローテーションを実現可能。RDS(MySQL, PostgreSQL, Aurora)に統合可能。

RDSのセキュリティ

RDS周りのセキュリティ知識

  • EBSボリュームやスナップショットにはKMS暗号化が適用される。
  • OracleSQL Serverは透明化データ暗号化(TDE)が適用可能。
  • SSL暗号化は全てのDBに適用可能。
  • IAM認証はMySQLPostgreSQLにのみ適用。ただし、IAM以外の認証はその他RDSにて行われる。
  • 暗号化されていないRDSスナップショットのコピーを暗号化可能。
  • CloudTrailはRDS内で実行されるクエリを追跡することはできない。

SSL/TLS暗号化通信

  • SSL(Secure Socket Layer)やTLS(Transport Layer Security)は通信を暗号化する技術。
  • SSL証明書認証局(CA: Certified Authorities)によって発行される。e.g. Symantec, GlobalSignなど。証明書には期限があるため、更新が必要。
  • 通信を確立するステップをハンドシェイクと呼ぶ。

SSL通信の仕組み(公開鍵・共通鍵暗号方式の組み合わせ)
f:id:hktech:20201226190048p:plain
https://jp.globalsign.com/ssl-pki-info/ssl_practices/ssl_encryption.html

SNI(Server Name Indication)

  • SNIとはSSL/TLSの拡張仕様であり、SSLハンドシェイク時にクライアントがアクセスしたいホスト名を指定することで、サーバ側がグローバルIPではなくホスト名によって複数の証明書を使い分けることができる仕組み。
  • ALB・NLBやCloudFrontではこの仕組みを活用可能。旧来のCLBなどでは使えない。

中間者攻撃(MITM: Man in the Middle Attack)

  • クライアントとサーバの間に中間者が入ることで通信を傍受する攻撃のこと
  • 対策としてはHTTPSで全ての通信を行うことと、DNSSEC(DNSトラフィックを保護するプロトコル)を採用しているDNSを使用することが重要。
  • Route 53 では、ドメイン登録には DNSSEC がサポートされているが、DNS サービスには DNSSEC がサポートされていない。Route 53 に登録されたドメインに DNSSEC を設定する場合は、別の DNS サービスプロバイダーを使用するか、独自の DNS サーバーをセットアップする必要がある。

ACM(AWS Certification Manager)

  • SSL証明書を管理するマネージドサービス。外部で購入した証明書をアップロードするか、ACMでがプロビジョンする形でパブリック証明書を作成(無料)するかのどちらかによってホストすることが可能。ACMによってプロビジョンした証明書は手動更新不要。
  • ACMによってSSL証明書をロードバランサ、CloudFront、APIゲートウェイAPIに適用可能。
  • ACMはリージョンサービス。グローバルアプリケーションで使う場合はSSL証明書を各リージョンにて設定する必要がある。

CloudHSM

  • Cloud HSM(Hardware Security Module)はクラウドベースのハードウェアセキュリティモジュール。
  • 商用で利用可能なほとんどの暗号化キーをHSMにエクスポート可能。S3でユーザ提供キーによるサーバサイド暗号化(SSE-C)を利用する際にはCloudHSMの活用を検討すると良い。
  • KMSとは異なり、CloudHSMではクライアント側が基本的に鍵の管理を行う。AWSのIAMが制御できるのはCloudHSMクラスタCRUD権限のみ。
  • 共通鍵・公開鍵の両方に対応(KMSは共通鍵のみ)。また、VPC内で管理されるため、他VPCからのアクセスがある場合はVPCピアリングが必要。無料枠なし。
  • ELBとEC2インスタンス間の通信をHTTPS化したい場合、各EC2の裏にCloudHSMを用意してSSLオフロードする方法がある。

S3オブジェクトの暗号化

  1. SSE-S3:AWS管理キーによるサーバサイド暗号化
  2. SSE-KMS:KMSで管理されるキーによるサーバサイド暗号化
  3. SSE-C:ユーザ提供キーによるサーバサイド暗号化
  4. CSE(Client Side Encryption)
  • GlacierのオブジェクトはAWS管理のもとすべてAES-256によって暗号化される。

S3イベント

  1. S3アクセスログ:詳細なリクエスト履歴が記録されているが取得に数時間かかる。ベストエフォートのため記録が欠損する可能性あり。
  2. S3イベント通知:オブジェクトの作成・削除などのイベントを、SNS・SQS・Lambda経由で通知。数秒から数分で通知。バージョニングが有効化されていれば全イベントを捕捉可能
  3. Trusted Advisor:バケットパーミッションを確認してくれる。バケットがパブリックになっていないかなど。
  4. CloudWatch Events:CloudTrailレベルロギングを有効化することでイベントを捕捉可能。

S3のセキュリティ

  • S3セキュリティはIAMベースとリソースベースの2種類がある。
  • リソースベースにはバケットポリシー、オブジェクトアクセスコントロールリスト(ACL)、バケットアクセスコントロールリスト(ACL)がある。

S3のバケットポリシー

  • バケットポリシーを使う場面としては、①バケットにパブリックアクセスを与える時、②アップロード時のオブジェクト暗号化を強制する時、③クロスアカウントアクセスを与える時がある。
  • 条件を付与できるのはIP単位(パブリックIPまたはElasticIP)、VPCまたはVPCエンドポイント、CloudFront Origin Access Identity、MFAのいずれか。

S3署名付きURL

  • ユーザに対してS3上にあるオブジェクトを一時的に公開したい場合に使用。
  • 有効期限を設定可能。
  • ダウンロード用はCLIによって署名付きURLを生成可能。アップロード用はSDKによって生成するため実装が難しい。

S3のVPCエンドポイントゲートウェイ

  • 特定VPCからのみS3バケットにアクセスさせた場合に利用。
  • バケットポリシーで特定のVPCを指定することでアクセスを許可。

S3オブジェクトロック

  • WORM(Write Once Read Many)モデルを採用。一定期間オブジェクトの削除を防ぐ仕組み。

Glacier Vault Lock

  • WORM(Write Once Read Many)モデルを採用。永久的に編集・削除を防ぐ仕組み。

セキュリティグループ

  • インスタンス単位でのセキュリティ設定。EC2, RDS, LambdaなどのENIに紐づく。
  • ステートフル:行きの通信が許可されていれば戻りも許可。逆も然り。
  • CIDRまたはセキュリティグループIDを指定可能。
  • デフォルトではインバウンドはDeny、アウトバウンドはAllowされている。

NACL(Network Access Control List)

  • サブネット単位でのセキュリティ設定。
  • ステートレス:行きと戻りの通信は個別に設定。
  • CIDRのみ指定可能。(ホスト名なども不可)
  • デフォルトではインバウンドもアウトバウンドもDenyされている。

DDoS攻撃(Distributed Denial of Service)への対策

  • DDoS攻撃:大量リクエストによりサーバの処理が追いつかず、サービスの機能を妨害する攻撃。
  • 対策としてはAWS Shield Standard/Advancedの適用、CloudFront・Route53の活用、オートスケーリングの有効化などがある。

AWS Shield

  • AWS Shield Standard: SYN/UDPフラッド攻撃、UDPリフレクション攻撃、その他第3層・4層などDDoS攻撃から守ってくれるセキュリティサービス。無料。
  • AWS Shield Advanced: より高度な攻撃に対する対策を提供。AWS DDoS対策チームへの常時アクセスが可能。また、DDoS攻撃によるインスタンス料金の負担について一部軽減してもらえる。有料。

AWS WAF(Web Application Firewall

  • 第7層(アプリケーション層)の攻撃を対策してくれるサービス。
  • ALB, APIゲートウェイ, CloudFrontなどに適用可能。CLB, EC2, S3ウェブサイトなどに適用したい場合はCloudFrontに適用。
  • 適用時にはWebACLの設定が必要。IPアドレス、HTTPヘッダ、URI文字列やサイズ制限・地域制限などの設定も可能。SQLインジェクションクロスサイトスクリプティングXSS)を防ぐことが可能。
  • 同一IPによるアクセスの頻度などをもとにアクセス制御可能。

AWS Firewall Manager

  • Organization内の全てのアカウントのWAF、AWS Shield Advanced、セキュリティグループなどのルールを一括管理するサービス。

AWS Inspector

  • EC2インスタンスのOS脆弱性やネットワーク設定の不備を検知してくれるサービス。
  • 使用するためにはAWS Inspector AgentがEC2インスタンスのOSにインストールされている必要がある。
  • AWS側でセットされているルールで設定を行う(カスタムルールは設定できない)。

AWS Config

  • AWSリソースのコンプライアンスを記録・監査してくれるサービス(リージョンサービス)。
  • 設定の変更などをSNSなどを通じて通知してくれるが、変更自体を防ぐことはできない。
  • マネージドルールおよびカスタムルール(Lambdaで記述)の設定が可能。変更をトリガーにしてLambdaをキックしたり、 Systems Manager自動化によるリソースの修復などが可能(セキュリティグループの修復やルール違反のインスタンス停止など)。

AWS Managed Logs

AWS GuardDuty

  • 機械学習による異常検知を活用した脅威検知を行うマネージドサービス。VPCフローログ・Cloud Trailログ・DNSログをインプットデータとする。
  • CloudWatch Eventと組み合わせて通知を行う。




【AWSソリューションアーキテクト試験用まとめ】IAMと認証連携

はじめに

AWS 認定ソリューションアーキテクト – プロフェッショナル(SAP)試験の勉強に向けた頭の整理として、以下の内容について用語レベルでまとめていきます。

※この項目分類については、UdemyのUltimate AWS Certified Solutions Architect Professional 2020コースを参考にしています。

f:id:hktech:20201206010537p:plain

IAM

  • アイデンティティ(ユーザなど)のリソースへのアクセス権限などを制御・管理するサービス。アクセス方法としては ①マネジメントコンソール、②AWS CLI、③AWS SDK、④IAM HTTPS APIの4つの方法がある。

STS

  • STSとはAWS Security Token Serviceの略であり、一時的なセキュリティ認証情報をユーザ(IAMユーザ以外含む)に与えることでAWSリソースへのアクセスを許可することが可能。これによりassume role やidentity federationなどを実現。クロスアカウントアクセスも実現可能。

Cognito

  • IAMユーザを作成することなく、匿名ユーザに対してもウェブアイデンティティフェデレーションを実現する仕組み。MFAもサポート。認証されたユーザの権限はIAMポリシーによって制御可能。

SAML2.0

AWS Directory Services

  • AWS Directory Servicesとは、Microsoft Active Directory (AD) を AWS の他のサービスと併用するための仕組み。管理者はユーザ、グループ、デバイスに関する保存したディレクトリを通じてリソースへのアクセスを管理可能。また、各種第三者アプリケーションに対してSSO(後述)を提供することも可能。
  • おおまかに①AWS Managed Microsoft AD、②AD Connector、③Simple ADに分類することができる。

AWS Microsoft AD

  • AWS上でMicrosoft AD(Windowsサーバ上で用意されるADドメインサービス)をマネージドサービスとして利用可能。オンプレミスのMicrosoft ADに対して信用接続が可能。

AD Connector

  • オンプレミスのMicrosoft ADに対して接続するゲートウェイの役割を持つ。ユーザ管理自体はオンプレミスのADが担う。

Simple AD

  • 安価でADサービスを実現するサービス。500-5000人のユーザを扱うことができるが、MFAやAWS SSOには対応しておらず、オンプレミスのMicrosoft ADとも接続不可。

AWS Organization

  • 複数アカウントをまとめて管理する仕組み。マスターアカウントは子アカウントを作成・招待することができ、IAMロールを作成したりAssume Roleを使うことでマスターから子アカウントにアクセス可能。これらの子アカウント作成ははAPIによって自動化可能。
  • OrganizationはOrganizational Units(OU)という単位で整理され、Root OU配下に組織単位・プロジェクト単位・開発環境単位などで自由に分けることができる。Organization単位でサービスコトロールポリシー(SCP)を設定することで、リソースへのアクセス制御を実現可能。

AWS Resource Access Manager

  • AWSリソースをOrganization内の他アカウントと共有するための仕組み。

AWS Single Sign On(SSO)

  • 複数アカウントと第三者アプリケーションのSSOを一元管理するサービス。オンプレミスAD、第三者アプリケーション、カスタムSAMLアプリケーションとの連携が可能。



Snowflakeの特徴と導入のメリットについてまとめた

2019年末に日本法人を設立し2020年9月に上場を果たしたSnowflake社が提供する、サービスとしてのSnowflakeについて紹介したいと思います。

Snowflakeのコンセプトおよびその特徴やメリットについて説明し、どのような企業や組織がSnowflakeを導入した方がいいかについてまとめたいと思います。

f:id:hktech:20201108220113p:plain

Snowflakeのコンセプト

SnowflakeとはAWSGCP、Azureなどの主要なクラウドプラットフォーム上で動くSaaS型のデータウェアハウスです。

このSaaS型のデータウェアハウスはDWaaS (Data Warehouse as a Service)とも呼ばれており、同様なサービスとしてはAWSAmazon Redshift、GCPGoogle BigQuery、AzureのAzure SQL Data Warehouseなどがあります。

Snowflakeは3つのクラウドプラットフォーム(AWS, GCP, Azure)に置かれたデータに対してそれぞれ独自のデータエンジンでクエリ処理をすることができるという点で、独自のポジションを築いています。

Snowflake自体はデータや計算資源を持たず、データ処理自体はすべて各クラウド上(AWSなど)で実行されます。Snowflakeはあくまでクエリを入力して集計指示をしたりデータを管理したりするハブもしくはWrapperのような役割を持ったサービスであるというイメージが近いかもしれません。


Snowflakeの特徴

前述したようにSnowflakeにおちてはデータそのものやデータ処理機能はクラウド側で持っているため、Snowflake自体が提供しているのはユーザが触れるウェブサービス部分とAWSなどのクラウド側のサービスの2種類です。いずれもユーザ側ではインストールや管理などの作業が不要であり、メンテナンスはSnowflakeがすべて担っています。

クラウド上のSnowflakeアーキテクチャは大きくストレージ層、クエリ処理層、サービス層の3つの層から構成されています。

f:id:hktech:20201103173817j:plain

ストレージ層では構造的なリレーショナルデータだけでなく、JSONなどの半構造データも最適化した形で保持することができます。ユーザは直接生のデータを見ることはできず、クエリ処理された結果のみを画面上で確認することができます。

クエリ処理層では仮想ウェアハウス(Virtual Warehouse)と呼ばれる複数の独立した計算資源を用意してデータ処理を行います。これによって、複数のユーザなどから同一のデータストレージに対してクエリが発行された場合でもパフォーマンスの低下などの影響がありません。各仮想ウェアハウスの計算リソースのプロビジョニングや構成などはSnowflake側で実施してくれます。

サービス層はSnowflakeによってプロビジョンされたクラウドインスタンスを実行する部分です。サービス層では、認証、インフラ管理、メタデータ管理、クエリのコンパイル・最適化、アクセス制御などの鍵となる複数のサービスを集約した層としての機能を持ちます。

Snowflakeを導入・利用するメリット

ここまでSnowflakeのコンセプトや特徴について説明してきましたが、実際にSnowflakeを導入するメリットはどこにあるのでしょうか。

Snowflake導入の主なメリットは以下の3つであると考えられます。

  1. 高速なデータ処理と従量課金方式
  2. 仮想ウェアハウス作成による同時実行
  3. データおよび権限管理

それぞれについて説明していきます。

高速なデータ処理と従量課金方式

Snowflakeは独自のSQLデータベースエンジンによって高速なデータ処理を実現しています。その速度は業界最速といわれているGoogle BigQueryに匹敵、もしくはそれを超える勢いといわれています。細かいパラメータや、パーティションキー、ソートキーなどの設定をすることなくSnowflake側でチューニングしてくれるため、データサイエンティストはチューニングをほとんど意識することなく分析や集計業務に集中することができます。

また、料金についてはBigQueryなどと同様に従量課金方式です。他サービスとの価格比較については各所で議論されているものの、大量のデータ処理を行うユーザにおいてはSnowflakeの方が安くつくという見方が多いようです。

仮想ウェアハウス作成による同時実行

Snowflakeではデータを処理する際に仮想ウェアハウス(Virtual Warehouse)と呼ばれる複数の独立した計算資源によってデータ処理を実施します。この独特なアーキテクチャによって、同一のデータソースに対して複数ユーザから同時にデータ処理のクエリを投げて処理することができます。これによって複数のクエリデマンドによる遅延などが発生せず、結果としてデータ処理が高速になるというメリットもあります。

副次的にはデータが仮想化されていることによって参照しているデータに変更が加えられないという点もあり、分析者は安心して分析業務を進めることができます。

データ・インフラおよび権限管理

最後に、Snowflakeはデータやインフラの管理を完全にサービス側に任せることができるというメリットがあります。Snowflakeはハードウェアはもちろんのこと、ソフトウェア自体も保持しない完全なSaaSであり、インフラの管理やソフトウェアなどのアップデートなどは当然不要です。

権限管理についても分析者目線で嬉しい機能を持っています。分析者は新たに作成したデータなどをWebUI上から必要なロールやユーザに対して権限付与をすることができます。これによって、従来多くの企業でとっていた「インフラ担当者のみがストレージの権限管理をしている」状態から一部脱却し、分析側で暫定的に加工したデータを特定の人のみに公開するなどといった立ち回りが可能になります。

まとめ

今回はSnowflakeの概要および導入時のメリットについてまとめてみました。日本国内ではあまり情報が揃っていない部分もあるものの、独特なアーキテクチャによる他サービスとの差別化がされていることはご理解いただけたかと思います。今後データ界隈ではますます話題になること間違いないので、ぜひ皆様も使ってみてはいかがでしょうか。

Sparkで使える機械学習(ML)パッケージについてまとめる

機械学習を扱うSparkアプリケーションの開発を行うにあたり、Spark上で使用することのできる機械学習パッケージ(ライブラリ)について調べてみたのでまとめます。

はじめに

機械学習を扱うような分析タスクや、機械学習を活用したソリューションの開発タスクなどがますます増えています。そのような中で、ビッグデータと呼ばれるような大規模データを扱わなければいけない場面が増えています。数十GB~数TBのデータに対して機械学習を適用しようとした場合、通常の単一マシンで動作するようなPythonプログラムではそのデータを扱いきれないことがほとんどです。このような場合、分散コンピューティングを実現することのできるHadoopSparkの活用を検討していくことになります。今回はSpark上で使うことのできる機械学習(ML)パッケージについてまとめます。

f:id:hktech:20190823024013p:plain


大規模データに適用する機械学習タスク

扱うデータが大規模であるからといって、必ずしもSpark上で機械学習を実施する必要があるわけではありません。例えば、件数でみれば数十億のレコードを持つログデータがあったとしても、SparkやHiveなどで何かしらの集約処理をすることで単一マシンで扱えるようなデータサイズに圧縮できる場合があります。このような場合には、豊富な機械学習ライブラリが用意されているPythonプログラムで処理をするという選択をとることが多いでしょう。

主に大規模データをSpark上で扱うような機械学習タスクには分類・クラスタリング・異常検知、時系列予測、レコメンデーションなどがあります。

f:id:hktech:20190823015930p:plain

Sparkで使える機械学習パッケージはこのようなタスクを実現する機械学習手法が実装されています。それぞれの機械学習パッケージの特徴に触れつつ、実装されている手法の違いについて比較していきます。

Sparkで使える機械学習パッケージ

Spark上で扱うことのできる機械学習パッケージは年々増えてきていますが、まだまだ数は限られています。近年では、AWSやDatabricksなどのクラウドプラットフォーマーが提供しているSageMaker SparkやDatabricksRunTimeMLなどの機械学習基盤が増えていますが、特定のクラウド上でしか使うことができないという不便さがあります。任意の環境で使用することのできる機械学習パッケージの選択肢は少なく、Sparkが公式で提供しているSparkMLパッケージが有名です。また、Deep LearningをSpark上で扱うことのできるパッケージとしてはYahoo社が開発しているTensorflow on Sparkや、Databricks社が開発しているspark-deep-learningなどがある。

f:id:hktech:20190823021236p:plain

本記事では、このような機械学習パッケージの中からいくつかについて詳しく取り上げ、それらの違いについて比較していきます。

Mahout

Apache Mahout*1は分散コンピューティングの歴史の中で最初期の機械学習パッケージです。MahoutはIBM*2が2011年に発表し、その後Hadoopの発展と共にOSS化が進んだパッケージです。Mahoutの読み方はマハウトであり、アイコンがHadoopの象に乗っていることからもわかるように「象使い」という意味です。現在はほとんど開発が進んでいないようです。

Mahoutは、従来Hadoop上で動く機械学習パッケージでしたが、現在はSpark上で動作します。
用意されている主な機械学習手法は以下の通りです。


このように実装されている手法は極めて限定的であるため、現在では使いどころはないと考えてよいと思います。

SparkMLlib/SparkML

SparkMLlib及びSparkMLはSpark公式*3が提供している機械学習パッケージです。2013年から開発が始まっており、最も広く使われているSparkの機械学習パッケージです。いずれもSpark本体と同様に、Scala, Python, Java, Rなどの言語からアクセスすることができます。SparkMLlibはSpark初期の機械学習パッケージとして一定の支持を得ていましたが、現在ではメンテナンスモードとなっておりこれ以上の追加開発はされない予定となっています。一方で、SparkMLはSpark2.0に向けて開発された比較的新しいパッケージであり、こちらは現在でも広く使われています。

SparkMLlibとSparkMLの違いとしては、SparkMLlibはRDDで扱うことを想定して実装されており、SparkMLはDataFrameおよびDatasetで扱うことを想定して開発されています。このように、大きな違いがある両者ですが、Github上では同一のリポジトリにて管理されています。また、両者に実装されている機械学習手法も共通のものが多いです。以下にその一部を列挙します。

  • 分類器: ナイーブベイズ、ロジスティック回帰、SVM、決定木、ランダムフォレスト、GBT
  • クラスタリング: Kmeans, LDA, 混合ガウスモデル
  • レコメンデーション: Alternating Least Square(ALS), Matrix Factorization
  • 回帰モデル: 一般化線形モデル、Ridge回帰、Lasso回帰

このように用意されている手法は限られているものの、一般的によく使われるアルゴリズムはおさえてあるようです。

MMLSpark

MMLSpark*4(Microsoft Machine Learning for Apache Spark)は2017年にMicrosoft社がAzure向けに開発・リリースした機械学習パッケージです。SparkMLと同様に、Scala, Python, Java, Rなどの言語によりアクセスすることができます。本パッケージはAzureクラウド向けに作られているものの、任意の環境で使用することが可能であるという特長があります。

MML Sparkに実装されている主な機械学習手法は以下の通りです。

  • 分類器: LightGBM
  • レコメンデーション: Smart Adaptive Recommendations (SAR)
  • その他: 自然言語処理、画像認識、DeepLearning系モデル

注目すべき点として、データサイエンティストに人気なLightGBMが実装されているということがあります。SparkMLそのものにはxgboostも実装されていないため、この点では優れたパッケージであるといえます。また、レコメンデーション手法である Smart Adaptive Recommendations (SAR)が実装されていることは、ALSによる協調フィルタリングしか存在しないSparkMLと比較するべき点でもあると思います。この手法では、単純な協調フィルタリングではなく、コンテンツ間の情報も活用することでコールドスタート問題を解決するものであるとのことなので、実用面で活用できるのではないかと考えています。

まとめ

Sparkで使える機械学習パッケージについてまとめました。一般的によく使われているSparkMLやSparkMLlib以外にも、いくつかのパッケージがあることがわかりました。今回は特定のクラウド上で使えるSageMaker SparkやDatabricksRunTimeMLについて紹介できなかったので、それらに触れる機会があれば今回紹介したいくつかのパッケージと比較をしたいと思います。