【新サービス】AWS上でフルマネージドなデータカタログとETLを実現するサービス『AWS Glue』がリリースされました!ETL処理の設定と実行

eyecatch_glue
2017年10月10日 一部内容変更
AWS Glueのジョブ、クローラ、開発エンドポイントの課金が分単位から秒単位に変更になりました。
Announcement: AWS Glue now supports per-second billing | AWS Discussion Forums

はじめに

こんにちは、yokatsukiです。

AWS re:Invent 2016のDAY2キーノートにて発表された『AWS Glue』が、本日2017年8月15日、NYC AWS Summitにて一般公開されました!

aws-glue-01

AWS Glueとは

サービス概要

AWS Glueは、「フルマネージドでサーバレス、そして、クラウド最適化された ETLサービス」です。

サービスの概要については、今までに弊社で記述したAWS Glue関連のブログエントリがありますので、そちらを参考にして下さい。

料金

一般公開を受けて料金が発表されました。以下のようにそれぞれの要素で料金が設定されていて、それらの合計値になります。

データカタログ(連携対象のメタ情報管理)

  • オブジェクト数とアクセスリクエスト数に応じて課金
  • 100万オブジェクトの格納まで無料、以降100万オブジェクト毎に 1ドル/月
  • 毎月100万リクエストまで無料、以降100万リクエスト毎に 1ドル/月

クローラー

  • DPU(データ処理ユニット)の時間単位で課金
    • 1DPU = 4vCPUと16GBメモリ
    • 各クローラーには2DPUが割り当て
  • 1DPU 0.44ドル/時
  • 最低10分とし、秒単位で切り上げ請求

ETLジョブ

  • DPU(データ処理ユニット)の時間単位で課金
    • 1DPU = 4vCPUと16GBメモリ
    • Glue ETL処理には最低2DPUが必要
    • 本番環境のデフォルトはジョブごとに10DPUを割り当て
    • 開発エンドポイントのデフォルトは開発エンドポイントごとに5DPUを割り当て
  • 1DPU 0.44ドル/時
  • 最低10分とし、秒単位で切り上げ請求

その他リソース利用料

ETL処理に使われるデータソース(S3やRDS)の利用料やデータ転送料は、利用に応じてそれぞれに課金が発生します。

料金イメージ

例として、100テーブル分のS3データを、以下の条件でETL処理してRDSの10テーブルに格納している場合を考えます。

  • データカタログ110テーブル分、処理毎にカタログにアクセス
    • 100万オブジェクト、100万アクセスよりはるかに小さいので無料
  • S3用クローラー、RDS用クローラをそれぞれ毎日10分動作
    • 0.44(ドル/時) * 2(DPU) * 2(種類) * 1/6(時間) * 30(日) = 8.8ドル/月
  • ETL処理を4DPUで毎日2時間動作
    • 0.44(ドル/時) * 4(DPU) * 2(時間) * 30(日) = 105.6ドル/月

    合計 114.4ドル/月

念のためですが、これは料金表から計算した机上値です。
実際にはこの料金の他にもS3やRDSの利用料等が掛かりますし、開発時には開発用エンドポイントの利用料金も発生するでしょう。また、ETLの処理性能が足りないのでDPUを追加して料金が上がる等の事情は発生するかもしれません。
ただ、特徴的なのは、料金の構成要素の大部分が、DPU数(マシンパワー) * 分単位の使用時間(処理時間)という点です。少ないDPUで単価は安い、しかし処理時間が長いので料金が掛かる、という状況が発生します。ここは色々な構成でトライしながら最適なポイントを見極める必要がありそうです。

AWS Glueを触ってみる

では実際のAWS Glueを操作してみることにします。

まず、AWS管理コンソールにログインします。沢山のサービスリストが表示されますが、AWS Glueはこの中の分析(Analytics)グループに含まれています。

aws-glue-released-01

現在のところ、AWS Glueは米国東部(N.Virginia)だけの提供です。

aws-glue-released-02

AWS Glueのトップページが表示されます。

aws-glue-released-03

AWS Glueは、こちらの画面にも表示されていますが、大きく3つの機能を持っています。

  1. データカタログの構築(Build your AWS Glue Data Catalog)
  2. ETLの生成と編集(Generate and edit transformations)
  3. ジョブのスケジュールと実行(Schedule and run your jobs)

この3つの機能を使う前提として、幾つかの準備が必要です。

  • AWS基盤の準備
    • IAMパーミッションの作成
    • データストアアクセス環境の設定

これらの操作を、順に追っていくことにします。

0.AWS基盤の準備

IAMパーミッションの作成

AWS Glueの使用前に、AWS Glueが利用するリソースにアクセスするできるよう、ポリシーやロールの設定が必要です。以下の手順で準備します。

  1. AWS Glueリソースへのアクセスを可能にするサービスポリシーを作成
  2. IAMロールを作成し、AWS GlueサービスポリシーとAWS Glueが使用するAmazon Simple Storage Service(Amazon S3)リソースのポリシーを添付
  3. IAMの役割に信頼ポリシーを添付
  4. AWS GlueコンソールにサインインするIAMユーザにポリシーを添付
  5. 開発用エンドポイント上のnotebook serverの作成に使用するポリシーを作成
  6. IAMロールを作成し、notebook serverポリシーを添付
AWS Glueリソースへのアクセスを可能にするサービスポリシーを作成

AWS Glueが使用するリソースアクセス権をポリシーとして定義します。AWS管理コンソールのIAMコンソールから、IAMポリシーGlueServiceRolePolicyを新規作成します。

aws-glue-released-04

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:*",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:GetBucketAcl",
                "ec2:DescribeVpcEndpoints",
                "ec2:DescribeRouteTables",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcAttribute",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetRolePolicy"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket"
            ],
            "Resource": [
                "arn:aws:s3:::aws-glue-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"				
            ],
            "Resource": [
                "arn:aws:s3:::aws-glue-*/*",
                "arn:aws:s3:::*/*aws-glue-*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::crawler-public*",
                "arn:aws:s3:::aws-glue-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:/aws-glue/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteTags",
                "ec2:DeleteNetworkInterface"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "aws-glue-service-resource"
                    ]
                }
            },
            "Resource": [
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:instance/*"
            ]
        }
    ]
}

改めてポリシーの一覧を確認したところ、似たポリシーAWSGlueServiceRoleがAWS管理ポリシーとして追加になっていました。ただし、こちらにはaws-glue-文字列を含むS3リソースへのDeleteアクションの設定(s3:DeleteObject)がありませんでした。

IAMロールを作成し、AWS GlueサービスポリシーとAWS Glueが使用するAmazon Simple Storage Service(Amazon S3)リソースのポリシーを添付

AWS GlueがETL処理を行う際に必要となる権限をロールとしてまとめます。ポリシー作成時と同様、IAMコンソールから、IAMロールAWSGlueServiceRoleDefaultの新規作成を行います。

aws-glue-released-05

AWSサービスロールからAmazon EC2を選択し、先に作成したIAMポリシーGlueServiceRolePolicyAmazonS3FullAccessにチェックをつけます。

aws-glue-released-06

次の画面でロールの名前をAWSGlueServiceRoleDefaultと設定し、ロールの作成を実行します。

IAMの役割に信頼ポリシーを添付

作成したロールとAWS Glueの間に信頼関係を確立させます。IAMコンソールのロール管理画面から、作成したロール(AWSGlueServiceRoleDefault)の名前を選択し、信頼関係のタブをクリックします。

aws-glue-released-07

信頼関係の編集ボタンをクリックし、内容を以下の記述に変更します。変更したら信頼ポリシーの更新ボタンをクリックし、保存します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": ["glue.amazonaws.com"]					
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
AWS GlueコンソールにサインインするIAMユーザにポリシーを添付

GlueコンソールまたはAWS CLIからAWS Glueを利用するユーザは、利用の為に必要な権限を持つ必要があります。権限は、AWS管理ポリシーAWSGlueConsoleFullAccessとして提供されているので、それをユーザに与えます。

IAMコンソールのポリシー一覧からAWSGlueConsoleFullAccessを検索し、チェックを付けた後、ポリシーアクションからアタッチを選択します。

aws-glue-released-08

アタッチのタブ、アタッチボタンと選択し、ユーザ/ロール/グループのリストから適用したいリソースをチェックボックスから選択し、ポリシーのアタッチをクリックします。今回はIAMユーザcm-katsuki.yosukeに与えます。

aws-glue-released-09

他にも以下の権限を与える必要があります。不足している場合はポリシーのアタッチを行っておきます。

  • CloudWatchLogsReadOnlyAccess
  • AWSCloudFormationReadOnlyAccess
  • AmazonAthenaFullAccess
IAMロールを作成し、notebook serverポリシーを添付

AWS Glueでは、開発用エンドポイントと呼ばれる、スクリプトを開発しテストするための環境を作成することができます。また、開発用エンドポイントの中にApache Zeppelin notebook serverを立てることができます。notebook serverを立てる場合はその為のポリシーが必要になりますが、あらかじめAWS管理ポリシーAWSGlueServiceNotebookRoleとして用意されています。このポリシーをアタッチしたIAMロールAWSGlueServiceNotebookRoleDefaultを作成します。

aws-glue-released-10

データストアアクセス環境の設定

AWS Glueを使ったデータ連携にRDSやRedshiftなどを使う場合、それらサービスの配置先としてVPCが必要になります。また、アクセス許可のためのセキュリティグループの設定など、細かいことを挙げればそれなりの準備が必要になります。これらを以下の手順で進めます。

  1. VPCとサブネット、VPCエンドポイント作成
  2. セキュリティグループの設定
  3. DNSの設定、その他
VPCとサブネット、VPCエンドポイント作成

AWS管理コンソールからVPCコンソールにアクセスし、以下のVPC、サブネットを構成します。

  • VPC
    • glue(10.0.0.0/16)
  • サブネット
    • glue-1a(10.0.0.0/24, AZ-a)
    • glue-1b(10.0.1.0/24, AZ-b)

次に、VPCエンドポイントを作成し、VPCとS3間のアクセスを安全な経路で結びます。VPCコンソールからエンドポイントを選択し、S3へアクセスする新しいVPCエンドポイントを作成します。

aws-glue-released-11

セキュリティグループの設定

AWS Glueがコンポーネント間で通信できるようにするには、すべてのTCPポートに対して自己参照のインバウンドルールを持つセキュリティグループを設定する必要があります。RedshiftやRDSが使用しているVPCセキュリティグループ定義に対し、以下の設定を行います。

  • インバウンド: 同じセキュリティグループの全てのTCPを追加

aws-glue-released-12

  • アウトバウンド: 既存の設定に加え、同じセキュリティグループの全てのTCPを追加

aws-glue-released-13

DNSの設定

VPCの設定において、DNSホスト名DNS解決両方とも有効(はい)になっている必要があります。必要に応じて、VPCコンソールのアクションから設定を変更します。

aws-glue-released-14

1.データカタログの構築

AWS管理コンソールを使ってAWS Glueでデータ・ソースを登録する事が出来ます。

AWS Glueでは、JSON、CSV、Parquetなど、多くの一般的なソースフォーマットやデータタイプに対して、あらかじめ作成された分類子を使用してデータソースをクロールし、データカタログを構築する事が可能です。また、独自のclassifiersを追加したり、AWS Glueコミュニティからclassifierを選択してクローリング対象として追加する事も可能です。

aws-glue-07

2.ETLの生成と編集

データソースとターゲットを選択して、AWS GlueはPythonコードを生成してソースからデータを抽出し、データを変換し、ロードする、即ち『ETL処理』を実行します。自動生成されたコードでは、データにおけるバリデーションエラー等のケースを処理する事が可能です。コードはお気に入りのIDEを使って編集し、独自のサンプルデータでテストする事が可能です。AWS Glueユーザーと共有しているコードを参照し、活用する事も可能です。

screenshot-glue-step2-etl-generation

3.ジョブのスケジュールと実行

AWS Glueではジョブスケジューラも提供されています!

定期的に、トリガに応じて、またはAWS Lambdaイベントに対応してフローを実行できます。 AWS GlueはETLジョブをApache Sparkノードに自動的に配布するため、データ量が増えるにつれてETLの実行時間を一定に保つ事が可能となります。

また、以下の様な調整や柔軟な対応も可能となるようです。

  • ジョブの実行を適切な順序で調整
  • 失敗したジョブを自動的に再試行
  • 時間通りにジョブを完了させたり、コストを最小限に抑えるために必要なインフラストラクチャを柔軟に拡張

aws-glue-08

これまでの各種サービスをまさに『糊(Glue)』のように繋いで実現される『AWS上でのモダンデータアーキテクチャ』を示した図が以下となります。これはとてもとても楽しみなサービスとなりそうです。

aws-glue-06

AWS Cloud Roadshow 2017 福岡