1. ホーム
  2. 記事一覧
  3. Amazon Athena入門 サーバーレスクエリサービスの始め方

2023.11.16

Amazon Athena入門 サーバーレスクエリサービスの始め方

    はじめに

    Amazon Athenaとは、AWSが提供するサーバーレスクエリサービスです。標準的なSQLを使用してS3内のデータを簡単に取得、分析することができます。こちらの記事では、Amazon Athenaの概要を解説します。後半では実際にAthenaを実行する環境を構築し、S3上のデータに対してクエリを実行していきます。

    Amazon Athenaとは?

    Amazon Athenaは、S3内に格納されているさまざまなフォーマットのデータに対して標準的なSQLを使用してデータを取得し、直接分析することができるサーバーレスのクエリサービスです。マネージドサービスのため、SQLを処理するサーバーの管理はAWS側で実施してくれます。利用者はクエリを行うシステムの管理を気にする事なく、データをどう分析するかに集中することができます。

    SQLについては、以下の記事で解説しています。

    https://envader.plus/article/58

    どのような業務で使用するのか?

    Athenaを実際に業務で使用する例として、サーバーやELB、WAF、CloudFrontなど様々なAWSサービスに対してのログ調査が挙げられます。

    利用するAWSサービスのログの保存先をS3へ設定することで、S3へログを集約させることができます。S3には様々なデータ形式が存在することになりますが、AthenaはS3上の様々な形式のデータ(JSON、CSV、TSVなど)に対してクエリを実行できるため、保存したデータの分析が可能になります。

    例として、ALBのアクセスログはgz形式の圧縮ファイルとしてS3へ保存されます。Athenaを利用することで、この圧縮ファイルを解凍することなくクエリを実行することが可能です。2023年10月15日~20日までの期間、ALBで発生した5xxエラーを調査したい。となった場合にも、S3のログに対してAthenaから標準的なSQLを用いることで、期間を絞った上でどのIPアドレスからどのくらいの回数アクセスが来ていたのか、何回5xxエラーが発生していたのかなどをすぐに分析することが可能になります。

    Athenaの特徴

    Athenaはマネージドサービスであり、サーバーレスでクエリを実行することができます。公式ドキュメントに記載されている特徴をもとにAthenaの特徴を振り返ります。

    Amazon Athena の特徴

    標準的なSQLを使用できる

    Amazon Athenaはより遅延が少なく、データ分析に最適化されたTrino(旧Presto)という分散SQLエンジンをベースとしています。

    https://trino.io/

    これにより、ANSI SQLというANSI(アメリカ国家規格協会)が定めた標準的なSQLを利用することができます。また、Trinoは異なるデータソースに対しても高速な分析ができる高性能分散SQLエンジンと言われています。

    Athenaではこの標準的なSQLを使用して、S3に保存されているCSVやJSON、TSVファイルなど様々なデータ形式のデータに対してクエリを実行することができます。

    クエリの実行時に料金が発生する従量課金制

    Athenaのデフォルト設定では、クエリの実行ごとにスキャンしたデータ量に基づいて料金が発生します。2023年10月現在、クエリ単位での料金は1TBあたり5.00USD(日本円約748円)となっています。

    クエリ単位の課金以外にも、定額制の時間単位で料金が発生するProvisioned Capacityや、Apache Sparkと呼ばれる分散処理アプリケーションを使用した際に課金される仕組みがあります。プロジェクトで使用する場合には適切な使用方法を検討する必要があります。

    Amazon Athenaの料金

    様々なデータに対してクエリを実行できる

    Athenaには「データソースコネクタ」というものが用意されています。これを利用することでGoogleのBigQueryやCloud Storageのような外部のクラウドデータ、またオンプレミスにも接続ができるようになります。2023年11月現在、30のサービスが対象とされています。

    使用可能なデータソースコネクタ

    また、AthenaではS3へ保存された様々なデータ形式を扱えるようにするために、SerDe(Serialize/Deserialize)というデータ処理を行います。この処理を行うことで、AthenaはS3に保存した様々なデータ形式に対してクエリを実行することができるようになります。

    サポートされるSerDesとデータ形式

    AWS Glueと統合されている

    AthenaはAWS Glueと統合されているため、データベースやテーブルを作成するクエリを実行すると、AWS GlueのData Catalogへメタデータ(データベースやテーブルの定義情報)が保存されます。

    AWS GlueのData Catalogへさまざまな情報まとめて保存できるため、Athenaはデータの中身を自動的に把握することが可能です。加えて、AWS GlueのETL(データの変換などの機能)を使うことで、データをより効率的な形に変えることができます。その結果、Athenaでのデータ検索が速くなり、コストも節約できます。

    出典:AWS Glue https://aws.amazon.com/jp/glue/

    Athenaを使ってクエリを実行してみよう

    ここからは、実際にAthenaを使ってクエリを実行します。Athenaを利用する際に必要な実行結果保存用のS3バケットの作成、デモデータの作成などを行い、実際にクエリを実行してみましょう。

    ハンズオンでは料金が発生することに注意してください。

    1. Athenaの実行結果保存用S3バケットの準備

    初めに、S3へクエリの実行結果保存用のバケットを作成します。Athenaでは、クエリの実行結果を保存するS3バケットを用意しておくことで、そのバケットへクエリの実行結果やメタデータを保存することができます。

    クエリ結果、最近のクエリ、および出力ファイルの使用

    1-1. AWSコンソールからS3へ遷移します。左メニューからバケットを選択し、「バケットを作成」をクリックします。

    1-2. 任意のバケット名を入力し、そのほかの選択肢はデフォルトのままバケットを作成します。

    これでクエリ実行結果保存用のバケットは作成完了です。

    2. クエリ対象のデータをデータ用S3バケットへ保存

    2-1. 再度新しくバケットを作成し、クエリの対象となるデータをS3バケットへ保存します。このバケットは先ほど作成したバケットとは別のものになるので注意が必要です。先ほどと同じ要領で、任意のバケット名でバケットを新しく作成します。

    2-2. バケット作成完了後、データ用バケットへサンプルデータをアップロードします。今回はChatGPTにダミーデータを作成してもらいました。

    timestamp,ip,method,status_code,url,user_agent,bytes_sent
    2023-11-01T12:00:00Z,192.168.1.1,GET,200,/index.html,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",612
    2023-11-01T12:01:00Z,192.168.1.2,POST,200,/api/login,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/602.3.12 (KHTML, like Gecko)",1024
    2023-11-01T12:02:00Z,192.168.1.3,GET,404,/not_found.html,"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1",0
    2023-11-01T12:03:00Z,192.168.1.4,GET,500,/api/data,"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36",0
    2023-11-01T12:04:00Z,192.168.1.5,GET,200,/products/1,"Mozilla/5.0 (iPad; CPU OS 10_3_2 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14F89 Safari/602.1",2048
    2023-11-01T12:05:00Z,192.168.1.6,PUT,200,/api/user/123,"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134",512
    2023-11-01T12:06:00Z,192.168.1.7,GET,301,/moved_resource,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15",256
    2023-11-01T12:07:00Z,192.168.1.8,GET,200,/images/logo.png,"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36",1024
    2023-11-01T12:08:00Z,192.168.1.9,DELETE,204,/api/item/987,"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36",0
    2023-11-01T12:09:00Z,192.168.1.10,GET,200,/articles/42,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A",1536

    このデータを元にクエリを実行していきます。今回はdummy-data.csvとしてバケットへアップロードしました。

    アップロード完了後は、Athenaのコンソールへ遷移しましょう。

    3. AthenaでDatabaseの作成

    3-1. Athenaのコンソールから、「Trino SQLを使用してデータをクエリする」にチェックを入れ、クエリエディタを起動を選択します。

    3-2. 作成したクエリ実行結果用のバケットを指定します。この作業をすることで、1.で作成したバケットへクエリの実行結果を保存することができます。

    「クエリエディタ」画面のタブメニューから、「設定」を選択し、管理をクリックします。

    3-3. 管理画面から「S3を参照」をクリックし、バケットの候補が表示されるため作成したクエリ実行結果用のバケットを選択し、「保存」をクリックします。

    3-4. 指定したバケットが保存場所へ設定できているか確認します。

    3-5. 次に、CREATE DATABASE句で新しくデータベースを作成します。データベース名を任意の名前にし、「実行」をクリックします。macユーザーであれば、ショートカットキーcommand + enterでクエリを実行可能です。

    CREATE DATABASE mydatabase;

    Athenaのクエリエディタのショートカットは、以下画像のアイコンをクリックすることでヘルプが引けます。

    クエリ実行結果は、エディタ下の「クエリ結果」に表示されます。

    3-6. エディタ左側、データベースタブをクリックすると作成したデータベース名が表示されます。作成したデータベース名をクリックし、データベースの切り替えを行います。

    4. Tableの定義

    4-1. 続いてテーブルを定義していきます。画像の部分をクリックし、新しいクエリのタブを開きます。

    4-2. 以下のクエリをエディタへ記述します。

    CREATE EXTERNAL TABLE IF NOT EXISTS web_access_logs (
      timestamp string,
      ip string,
      method string,
      status_code int,
      url string,
      user_agent string,
      bytes_sent int
    )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES (
      "separatorChar" = ",",
      "quoteChar"     = "\"",
      "escapeChar"    = "\\"
    )  
    LOCATION 's3://athena-data-xxxxx/'--自身のバケット名を指定すること
    TBLPROPERTIES ("skip.header.line.count"="1");

    以下、クエリの解説をしていきます。

    • CREATE EXTERNAL TABLE IF NOT EXISTSで、テーブルを定義しています。それぞれのデータに対してカラム名、型を宣言します。
    • ROW FORMAT SERDEは、テーブルがどのようにデータを解析するかを指定するもので、このケースではOpenCSVSerdeを使用しています。これは、CSV フォーマットのデータを解析するためのものです。
    • SERDEPROPERTIESは、CSV の解析方法をカスタマイズするためのプロパティです。ここでは、列の区切り文字としてコンマ、引用符としてダブルクォート、エスケープ文字としてバックスラッシュを指定しています。
    • LOCATIONは、データが保存されているS3バケットのパスを指定します。この部分を間違えるとクエリ実行後のデータが空になってしまう場合があるため注意が必要です。
    • TBLPROPERTIESは、テーブルの追加プロパティを指定します。ここでは、CSV ファイルのヘッダ行をスキップするように指定しています。

    4-3. エディタへクエリを記述したら、エディタ左下の実行をクリックします。クエリ結果が「完了済み」になれば実行完了です。

    4-4. この時点で、左側メニューのテーブルの部分へ作成したテーブル名が表示されます。+をクリックすることで、クエリで定義したテーブルのカラム名と型が確認できます。

    5. データを取得する

    5-1. SELECT文でデータを取得します。再度新しいタブを開き、新しいタブ内でクエリを記述します。

    SELECT * FROM web_access_logs;

    5-2. クエリを実行し、クエリ結果が返ってくれば完了です。

    5-3. 以下に、SQLのサンプルを提示します。

    • データのトラフィック量が最も多かったIPアドレスを調べる
    SELECT ip, SUM(bytes_sent) as total_bytes
    FROM web_access_logs
    GROUP BY ip
    ORDER BY total_bytes DESC
    LIMIT 10;
    • 最もアクセスが多いURLを検索する
    SELECT url, COUNT(*) as num_accesses
    FROM web_access_logs
    GROUP BY url
    ORDER BY num_accesses DESC
    LIMIT 10;
    • 特定のステータスコードのログを取得する
    SELECT * FROM web_access_logs WHERE status_code = 404;
    • HTTPメソッドの数を取得して降順にする
    SELECT method, COUNT(*) as count
    FROM web_access_logs
    GROUP BY method
    ORDER BY count DESC;

    5-4. 実行したクエリは保存することもできます。頻繁に使用するもの、重要なクエリに関しては保存しておくことで簡単に再利用することができます。

    保存したクエリは、クエリエディタの「保存したクエリ」タブから確認できます。

    まとめ

    今回は、Athenaの基本となる概要を解説しました。

    Athenaでは標準的なSQL文を使用して、S3へ保存したデータに対してクエリを実行することができます。圧縮されたファイルなどに対してもそのままクエリを実行できるのは非常に魅力的な機能だと思います。ただし、一部対応していないSQL文も存在するため注意が必要です。

    スキャンしたデータ量に基づいて料金が発生する従量課金制というところもポイントで、クエリを最適化することでコスト削減に繋げることも可能です。

    ハンズオンでは、データの保存やテーブル定義、クエリの実行までを紹介しました。今回は手動でデータを保存しましたが、実際の業務では稼働しているサーバーやELBなどからの大量のログをS3へ保管し、分析を行います。まずは基本的な操作を理解し、Athenaについて親しみを持っていただけたら幸いです。

    【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

    IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

    プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

    「フリーランスエンジニア」

    近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

    「成功する人とそうでない人の違いは何か?」

    私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

    比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

    多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

    note記事3000いいね超えの殿堂記事 今すぐ読む

    エンベーダー編集部

    エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

    RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

    関連記事