AWS Glueの開発エンドポイントの利用方法

GlueでPySparkプログラムを開発するための、開発エンドポイント作成方法について記載します。

公開鍵/秘密鍵の作成

Glueエンドポイントへのアクセスは、公開鍵/秘密鍵が必要となります。ので、OpenSSH形式の公開鍵/秘密鍵を、事前に作成しておきます。

エンドポイントを配置するVPC、ネットワークの用意

エンドポイントを配置したいVPCに対して、事前に設定を実施します。

(1) enableDnsHostnames の有効化

エンドポイントを設置するVPCで、DNS ホスト名の編集(enableDnsHostnames)が有効になっているかどうか確認します。enableDnsHostnames は、VPC上に作成されたENIに、Public DNS名を付与するか/しないかを定義する設定となります。

f:id:goodbyegangster:20180804145246p:plain

(2) Public Subnetに、S3エンドポイントの設定

エンドポイントを設置するサブネットは、Public Subnetである必要があります。且つ、S3エンドポイントへアクセスが可能である必要があります。

これはVPCのルーティングテーブルの画面。S3エンドポイントへの経路情報を作成してあげます。

f:id:goodbyegangster:20180804145249p:plain

(3) an inbound self-reference rule を持つセキュリティグループの作成

an inbound self-reference rule を持つVPCセキュリティグループを作成します。an inbound self-reference rule とは、以下みたいな感じ。自分自身を参照するInboundルールのことです。

f:id:goodbyegangster:20180804145251p:plain

開発エンドポイントを、VPC内のRedshiftやRDSとアクセス可能とするために、このセキュリティグループを利用することになります。

開発用エンドポイントの作成

実際にエンドポイントを作成します。

(1) AWSコンソールより、「ETL」-「Dev endpoints」と選択して、「Add Endpoint」をクリックして、以下を入力します

  • エンドポイント名
  • 利用IAM role
    • Glueのクローラーや、ETL処理で利用しているRoleを選択すればOK
  • Data processing units(DPUs)
    • 1DPUで、4vCPU/16GB Memory
    • 最低2個から
    • 開発エンドポイントの課金に関わる
  • Python library path/Dependent jars path
    • エンドポイント作成時に、指定したライブラリをロードして作成してくれます

f:id:goodbyegangster:20180804145253p:plain

(2) ネットワーク設定情報を選択/入力します。今回は Choose a VPC, and security groups を選択します。

  • Skip newtork information
    • 扱うデータストアがs3だけの場合、この選択でOK
  • Choose a connection
    • VPC内のDBをデータストアとして利用したい場合、これを選択
    • 接続先のRedshiftやRDSの接続定義情報、JDBC接続するためのコネクション定義を作成することになります
  • Choose a VPC, and security groups
    • エンドポイントをVPC内部に配置できます
    • 配置するVPC、サブネット、およびエンドポイントで利用するセキュリティグループの情報を入力します

f:id:goodbyegangster:20180804145255p:plain

(3) エンドポイントで利用する公開鍵をアップロード、または鍵情報をアップロードします

f:id:goodbyegangster:20180804145016p:plain

(4) Review画面が表示されるので、Finishとするとエンドポイントが作成開始されます。

できました。

f:id:goodbyegangster:20180804145019p:plain

SparkのREPLに接続してみる

暫くすると、エンドポイントのステータスが READY になるので、これで利用可能になります。指定したサブネットにエンドポイントができるので、該当のサブネット上にLaunchされたEC2から、GlueのSparkにログインできます。接続元となるEC2には、事前に作成した an inbound self-reference rule のセキュリティグループを付与しましょう。でないと、ログインできません。

[ec2-user@ip-172-31-12-17 ~]$ ssh -i ./glue_DevEndPoint.pem glue@ip-172-31-7-100.ap-northeast-1.compute.internal -t gluepyspark
Python 2.7.12 (default, Sep  1 2016, 22:14:00)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/share/aws/glue/etl/jars/glue-assembly.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/spark/jars/slf4j-log4j12-1.7.16.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
18/07/30 16:30:43 WARN Client: Neither spark.yarn.jars nor spark.yarn.archive is set, falling back to uploading libraries under SPARK_HOME.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 2.2.1
      /_/

Using Python version 2.7.12 (default, Sep  1 2016 22:14:00)
SparkSession available as 'spark'.
>>>

GlueのPySparkから、RedshiftやRDSを接続する場合にも、該当のRedshiftやRDSに an inbound self-reference rule のセキュリティグループを付与しましょう。でないと、アクセスできません。

インターネットからのアクセス

この方法で開発エンドポイントを作成した場合、開発エンドポイントのdns名はPrivate dns名となっているはずです。ローカルPCからアクセスしたい、という場合には、以下の方法で可能です。

スクリプトの開発に開発エンドポイントを使用する - AWS Glue

(公式マニュアルに書いてあるとおりですが)つまり、今作った開発エンドポイントはENIを持っているので、そのENIに対して、Elastic IPを紐づけてあげればいいのですね。なるほど、なるほど。

アクセスする際には、 an inbound self-reference rule のセキュリティグループに、ローカルPCからアクセス許可となるインバウンドルールを付与してあげましょう。で、取得したアクセス先IPアドレスをElasticIPに変更してsshコマンドを実行すれば、セキュアな形でローカルPCから開発エンドポイントへアクセス可能となります。

利用コスト

エンドポイントを作成している期間中、指定したDPU数分の課金が10分単位で発生します。金額については、下記のAWS公式資料を参照。

AWS Glue の料金 – アマゾン ウェブ サービス (AWS)

エンドポイントを作成している間は、1DPUあたり $0.44/1時間 かかり、最小単位は10分からとなっています。気づくと結構お金がかかっているので注意。