Glueの開発エンドポイントとSageMakerノートブックを試してみた

こんにちは。DI(データインテグレーション)部 改め データアナリティクス事業本部インテグレーション部 の大高です。

Glueと仲良くなるべく色々と触っています。今回は「開発エンドポイント」を試してみたいと思います。

なお前回はこちらです。

GlueのPython Shellジョブでファイルの文字コードを変更してみた

「開発エンドポイント」とは?

下記ヘルプに記載のとおり、Glue開発時にはインタラクティブに開発ができるように「ノートブック」の機能が用意されています。「ノートブック」でコードの記述と実行ができますが、その実行環境が「開発エンドポイント」になるようです。

AWS Glue により、抽出、変換、およびロード (ETL) スクリプトを反復的に開発してテストする環境を作成できます。ノートブック でスクリプトを開発できます。AWS Glue​ エンドポイントを指してテストします。開発プロセスの結果に満足したら、スクリプトを実行する ETL ジョブを作成します。このプロセスにより、インタラクティブな方法で機能を追加してスクリプトをデバッグできます。

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

「ノートブック」について

「ノートブック」は現在「Amazon SageMaker ノートブック」と「Apache Zeppelin ノートブックサーバー」の2種類を利用することが出来るようです。

ノートブックの管理 - AWS Glue

AWS Glue コンソールでノートブックを使用する - AWS Glue

「Apache Zeppelin ノートブックサーバー」は以下の記事にあるようにApache Zeppelinが利用できるEC2インスタンスが作成されるようです。

AWS Glue 実践入門:Apache Zeppelinによる Glue scripts(pyspark)の開発環境を構築する

一方で、「Amazon SageMaker ノートブック」は「統合された Jupyter オーサリングノートブックインスタンスを提供します。」と記載があるようにノートブックの作成や管理も出来るし、マネージメントコンソールからノートブックを開くこともできるようです。

動作イメージとしては以下の記事のような感じですね。

Amazon SageMakerでChainerのMNISTをさっそく試してみた #AWSSummit

今回は「Amazon SageMaker ノートブック」を試してみたいと思います。

IAMロールの準備

例によってIAMロールの準備が必要となります。

「開発エンドポイント」用のIAMロール

これは前回の記事でも作成しましたが、以下の記事の「Step2」を参考に作成します。

AWS Glue 実践入門 環境準備編(1):IAM権限周りの設定について

「Amazon SageMaker ノートブック」用のIAMポリシーとIAMロール

「Amazon SageMaker ノートブック」用には別途IAMロールが必要となります。以下を参考に作成してきます。

ステップ 6: Amazon SageMakerノートブックの IAM ポリシーを作成する - AWS Glue

ステップ 7: Amazon SageMaker ノートブックの IAM ロールを作成する - AWS Glue

まずはIAMポリシーを作成します。

IMAポリシーの作成画面を開き、「JSON」エディタを開いてヘルプに記載されているポリシーを貼り付けます。貼り付けたら、ヘルプに記載の通り赤字の部分を適宜修正します。

ヘルプでは作成した開発エンドポイントを指定するなどの記載がありますが、今回はお試しなので少し大きめに以下のポリシーで試します。(XXXXXXXXXXXXと記載している箇所はAWSのアカウントIDを指定します)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Action": [
                "s3:GetObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents",
                "logs:CreateLogGroup"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:/aws/sagemaker/*",
                "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:/aws/sagemaker/*:log-stream:aws-glue-*"
            ]
        },
        {
            "Action": [
                "glue:UpdateDevEndpoint",
                "glue:GetDevEndpoint",
                "glue:GetDevEndpoints"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:glue:ap-northeast-1:XXXXXXXXXXXX:devEndpoint/*"
            ]
        }
    ]
}

最後に適宜名前を付けて「ポリシーの作成」をクリックして作成します。

次にIAMロールの作成画面を開き「AWS サービス」の「SageMaker」を選択します。画面下部で「SageMaker - Execution」が表示されていることを確認して「次のステップ: アクセス権限」をクリックします。

「AmazonSageMakerFullAccess」が選択されていることを確認して「次のステップ: タグ」をクリックします。実運用ではもう少しポリシーの絞り込みが必要になるかと思いますが、今回はそのままとします。

タグは適宜必要に応じて作成してください。

最後にロール名を指定して作成しますが、注意点としてロール名の先頭に AWSGlueServiceSageMakerNotebookRole を付与します。これにより、Glueでのロール選択時に認識されるロールとなるようです。

ロールが作成できたら、最後の手順としてロールを開き、追加で先程作成したポリシーをアタッチしておきます。

これでIAMロールの準備は完了です。

「開発エンドポイント」と「Amazon SageMaker ノートブック」の作成

準備ができたので早速「開発エンドポイント」と「Amazon SageMaker ノートブック」をそれぞれ作成してみます。

「開発エンドポイント」の作成

マネージメントコンソールでGlueの「開発エンドポイント」の画面を開き、「エンドポイントの追加」をクリックします。

適宜「開発エンドポイント名」を入力し、「IAMロール」には先程準備した「開発エンドポイント」用のIAMロールを指定して「次へ」をクリックします。

「ネットワーキング」については、今回は特に利用しないのでスキップします。

「SSH パブリックキー」については、SageMakerノートブックを利用するので記載されている通りに省略します。

最後に内容を確認して「完了」します。

開発エンドポイントの作成中は以下のように表示されています。

作成が完了すると以下のように表示が変わり、ステータスが「READY」となります。

なお、この「READY」の状態における開発エンドポイントの起動時間により課金が行われますので、不要になったらエンドポイントを削除しましょう。

料金 - AWS Glue | AWS

「Amazon SageMaker ノートブック」の作成

さて、開発エンドポイントが「READY」になったら、いよいよ目的の「Amazon SageMaker ノートブック」です。

「SageMaker notebooks」のタブから「ノートブックサーバーの作成」をクリックします。

「Notebook name」には適宜名前を指定し、開発エンドポイントには先程作成したものを、IAMロールには「既存のIAMロールを選択」から、こちらも先程作成したノートブック用のロールを指定して作成します。

作成直後は、ノートブックサーバーが Starting のステータスなので暫く待ちます。

ステータスが Ready になったら準備完了です。

「Amazon SageMaker ノートブック」でコードの記述と実行をしてみる

では、いよいよノートブックです。先程作成したノートブックサーバーの画面を開いて「Open」をクリックします。

ノートブックの利用料金についての注意書きが出るので、確認して「OK」をクリックします。

すると、あとは一般的なJupyterノートブックの画面になると思います。ファイルに「Glue Examples」というフォルダがあるので開いてみます。

サンプルが用意されているので、こちらを開いてみます。

このサンプルでは一般的なジョインやフィルタリングなどのサンプルとなっていました。

当たり前ですが、新規にファイルを作成して自由にコードも記載できます。前回の記事で試したようなコードも、以下のように動かすことができました。

実際の開発では、ここでGlueのSparkジョブに記載するスクリプトを書いて動作確認する流れになるのかと思います。

後片付け

開発が終わったら、ノートブックサーバーを「停止」ボタンで停止して、以下のように Stopping ステータスにします。

「開発エンドポイント」は「アクション > 削除」から削除しておきます。

まとめ

以上、Glueの「開発エンドポイント」を試してみた結果でした。

ちょっと環境を整えるのが大変ですが、GlueのSparkジョブの開発をジョブのスクリプト編集画面で試行錯誤するのは時間が掛かる上にデバッグもしずらいので、うまく「開発エンドポイント」を利用すれば効率よく開発できそうですね。

一方で、開発エンドポイントを立ち上げっぱなしだと、それなりに利用料金が掛かってしまうので、その辺りはうまく運用しないといけないと感じました。

どなたかのお役に立てれば幸いです。それでは!