【新サービス】AWS上でフルマネージドなデータカタログとETLを実現するサービス『AWS Glue』がリリースされました!使い始めの準備をご紹介

はじめに

こんにちは、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万オブジェクトの格納まで無料、以降10万オブジェクト毎に 1ドル/月
  • 毎月100万リクエストまで無料、以降10万リクエスト毎に 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)

これらの機能を順に設定することで、AWSマネージドなETL処理を実装することができます。それぞれの機能に関する概要説明は、今日AWS Glueの一般公開と共に提供された下記Amazon Web Servicesブログにアニメーション付きで載っています。こちらをご覧ください。

AWS Glue操作の為に必要な準備

さて、AWS Glueの操作イメージは上記ブログで掴めたかと思いますが、実はそこに辿り着くまでには、AWSの基盤周りで幾つかの準備が必要になります。行程がそれなりに長くなったので、本エントリでは準備部分に焦点を当てて、Glueコンソールで操作ができるようになるまでを紹介します。
Glueコンソールによる操作は後日別エントリとして記載しますのでご了承下さい。

  • IAMパーミッションの作成
    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ポリシーを添付
  • データストアアクセス環境の設定
    1. VPCとサブネット、VPCエンドポイント作成
    2. セキュリティグループの設定
    3. DNSの設定、その他

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

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

まとめ

AWS Glueについての概要おさらいと、価格、そして利用に先立っての準備内容について紹介しました。本エントリで紹介した準備作業、ちょっと複雑だったと思いますが、AWS Glueを最初に使い始める際に一度だけ設定が必要になるものなので、その点は安心いただきたいと思います。

次のエントリでは、いよいよGlueコンソールを使って、クローラやジョブの設定をしていくことになるので是非お楽しみに。それでは、また。

参考資料

  • 費用のところ、「100万オブジェクトの格納まで無料、以降100万オブジェクト毎に 1ドル/月」とありますが、10万オブジェクト毎に1ドルかと思います。

    • Yosuke Katsuki

      ご指摘ありがとうございます。
      すみません…確かにその通りです。訂正しました。

      • 修正ありがとうございます。リクエスト費用の方も「毎月100万リクエストまで無料、以降10万リクエスト毎に 1ドル/月」と直されたようですが、こちらは100万リクエスト毎に1ドルなんです。。。