背景・目的
Amazon EMR Studioについて、触ったことが無かったので試してみようと思います。
また、あわせて機能等、基礎的な部分についても整理したいと思います。
まとめ
- EMR Studioは、WebベースのIDE。
- 認証には、IAM認証と、IAM Identity Centerが利用できる。
- ワークスペースコラボレーションを有効にすると、ワークスペース内の他のユーザーと同時にコラボレーションが可能
概要
Amazon EMR Studio
- EMR クラスターで実行される、フルマネージド型の Jupyter ノートブック用のウェブベースの統合開発環境 (IDE) とのこと。
- チームが R、Python、Scala、PySparkで記述されたアプリケーションの開発、視覚化、およびデバッグを行うために EMR Studio をセットアップする。
- EMR Studio は、IAM および IAM ID Center と統合されているため、ユーザーは企業の認証情報を使用してログインできる。
- EMR Studio 自体は無料。EMR Studio を使用する場合は、S3 ストレージと EMR クラスターに料金がかかる。
EMR Studio の主な機能
- IAMまたは IAM アイデンティティセンター、エンタープライズ ID プロバイダーを使用してユーザーを認証する。
- EMR クラスターにオンデマンドでアクセスして起動し、Jupyter ノートブックジョブを実行
- EMR on EKS クラスターに接続して、ジョブ実行としてWorkerを送信する
- サンプルノートブックを探索して保存する。
- Python、Spark Scala PySpark、Spark R、または SparkSQL を使用してデータを分析し、カスタムカーネルとライブラリをインストールする。
- 同じWorkspace の他のユーザーとリアルタイムでコラボレーションする。
- ノートブック内のデータを操作する前に、EMR Studio SQL Explorer を使用してデータカタログをブラウズし、SQL クエリを実行し、結果をダウンロードする。(??)
- Apache Airflow や Amazon Managed Workflows for Apache Airflow(MWAA) などのオーケストレーションツールを使用して、スケジュールされたワークフローの一部としてパラメータ化されたノートブックを実行する。(参考)
- GitHub BitBucketやなどのコードリポジトリをリンクする。
- Spark History Server、Tez UI、または YARN タイムラインサーバーを使用してジョブを追跡およびデバッグする。
- EMR Studio も HIPAA 対応であり、HITRUST CSF および SOC 2の下で認定されているとのこと。
Amazon EMR Studio の仕組み
作成する各 EMR Studio では、下記の AWS リソースが使用される。
- サブネットとVPC
- ユーザーは、指定された VPC 内の EMR および EMR on EKS クラスターで Studio カーネルとアプリケーションを実行する。
- EMR Studio は、Studio の作成時に指定したサブネット内の任意のクラスターに接続できる。
- IAM ロールとアクセス許可ポリシー
- ユーザーアクセス許可を管理するには、ユーザーの IAM ID またはユーザーロールにアタッチする IAM アクセス許可ポリシーを作成する。
- EMR Studio は IAM サービスロールとセキュリティグループを使用して、他の AWS のサービスとの相互運用も行う。詳細は下記を参照。
- セキュリティグループ
- EMR Studio は、セキュリティグループを使用して Studio と EMR クラスターの間に安全なネットワークチャネルを確立する
認証とユーザーログイン
下記のIAM 認証モードと IAM ID センター認証モードという 2 つの認証モードをサポートしている。
- IAM 認証モード
- IAM 認証モードでは、IAM 認証または IAM フェデレーションを使用
- IAM Identity Center 認証モード
- ユーザーに EMR Studio へのフェデレーションアクセス権を付与できる
- EMR Studio では、IAM アイデンティティセンター用の次の ID プロバイダーの使用をサポートしている。
- AWS Managed Microsoft AD およびセルフマネージド Active Directory
- SAML ベースのプロバイダー
- IAM ID センターディレクトリ
アクセスコントロール
EMR Studio では、IAM ベースのポリシーを使用してユーザー認可 (アクセス許可) を設定する。これらのポリシーでは、許可するアクションとリソース、およびアクションを許可する条件を指定する。
- IAM 認証モードのユーザーアクセス許可
- EMR Studio で IAM 認証を使用するときにユーザーアクセス許可を設定するには、IAM アクセス許可ポリシーで
elasticmapreduce:RunJobFlow
のようなアクションを許可する
- EMR Studio で IAM 認証を使用するときにユーザーアクセス許可を設定するには、IAM アクセス許可ポリシーで
- IAM Identity Center 認証モードのユーザーアクセス許可
- IAM アイデンティティセンター認証を使用する場合、単一の EMR Studio ユーザーロールを作成する。ユーザーロールは、ユーザーがログインしたときに Studio が担う専用の IAM ロールである。
ワークスペース
- Workspace は EMR Studio の主要な構成要素。ノートブックを整理するには、ユーザーは Studio に 1 つ以上の Workspace を作成する。
- Workspace はノートブックの作業の状態を保持する。
- Workspace ユーザーインターフェイスは、EMR クラスターの作成とアタッチ、ジョブの実行、サンプルノートブックの探索、Git JupyterLabリポジトリへのリンクを可能にする追加ツールでオープンソースインターフェイスを拡張しているとのこと。
- EMR Studio Workspace の主な機能は下記の通り。
- Workspace の可視性は Studio ベースです。ある Studio で作成した Workspace は、他の Studio では表示されない。
- デフォルトでは、ワークスペースは共有され、すべてのStudioユーザーに表示される。ただし、Workspace を開いて作業できるのは一度に 1 人のユーザーのみ。
- ワークスペースコラボレーションを有効にすると、ワークスペース内の他のユーザーと同時にコラボレーションができる。
- Workspace 内のノートブックは、コマンドを実行するために同じ EMR クラスターを共有する。Workspace は、Amazon EC2 で実行されている Amazon EMR クラスター、または Amazon EMR on EKS 仮想クラスターおよびマネージドエンドポイントにアタッチが可能
Amazon EMR Studio でのノートブックストレージ
- Workspace を使用している場合、EMR Studio は、Studio に関連付けられた Amazon S3 の場所にあるノートブックファイルにセルを定期的に自動保存される。
考慮事項と制約事項
全ては記載していません。詳細はこちらをご確認ください。
- EMR Studioは、Amazon EMR バージョン 5.32.0 (EMR 5.x シリーズ) または 6.2.0 (EMR 6.x シリーズ) 以降で動作
- Amazon S3 に保存されているノートブックファイルへのアクセス許可を定義する場合、または AWS Secrets Manager からシークレットを読み取る場合、EMR サービスロールを使用する。
機能の制限
- EMR Studio では、下記のEMR 機能はサポートされていない。
- Kerberos 認証を指定するセキュリティ構成を使用した EMR クラスターでのジョブのアタッチと実行
- 複数のマスターノードを持つクラスター
- Lake Formation と統合されたクラスター
実践
こちらを元に試してみます。
事前準備
S3バケットを作成
- WorkspaceやEMRで使用するため、S3バケットを用意します。
ネットワークの作成
VPCの作成
- WorkspaceやEMRで使用するため、VPCを作成します。
S3のVPCエンドポイントを作成
- VPCに作成するEMRクラスタやノートブックから、S3にアクセスするためVPCエンドポイントを作成します。
SSMの設定
EMRのEC2インスタンスにSSMでアクセスするため、設定する。
SSMのVPC エンドポイントを作成
- エンドポイント作成画面で、下記を入力し、「エンドポイントを作成」をクリックします。
ssmmessages、EC2MessagesEndpointのVPCエンドポイントを作成
- 上記のSSMのVPCエンドポイントと同様の手順で下記のVPCエンドポイントを作成します。
- com.amazonaws.{リージョン}.ec2messages
- com.amazonaws.{リージョン}.ssmmessages
- 最終的には、下記の4つのVPCエンドポイントを作成しました。
セキュリティグループの作成
-
SSMからのアクセス(443)と、S3 VPCエンドポイントへのアウトバウンドを設定します。なお VPCエンドポイントはプレフィックスリストを指定する必要があります。調べ方は【小ネタ】Prefixリストを調べるに載せています。
VPCエンドポイントにセキュリティグループをアタッチ
- 上記で作成したセキュリティグループを、作成済みのエンドポイントにアタッチし直します。(作成時にアタッチしておくほうが効率的です。)
EC2の作成
念の為、SSMが利用できるか確認してみます。
EC2用のIAMロールを作成します。
-
IAMロール名を入力し、「ロールを作成」をクリックします。
-
S3にアクセスできるように、IAMポリシーをインラインで作成します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::{作成したバケット名}", "arn:aws:s3:::{作成したバケット名}/*" ] } ] }
EC2インスタンスの起動
-
EC2インスタンスを起動します。このとき、作成したIAMロールをIAMインスタンスプロファイルにアタッチします。また、VPCやセキュリティグループ等も作成したものを指定します。
-
ユーザデータには、下記を指定します。必須ではありません。
#!/bin/bash sudo yum -y update sudo systemctl enable amazon-ssm-agent sudo systemctl start amazon-ssm-agent sudo yum install -y amazon-linux-extras sudo yum install -y aws-cfn-bootstrap sudo amazon-linux-extras install -y python3.8 sudo yum -y install jq sudo yum -y install python3-pip sudo yum -y install postgresql sudo chown ssm-user /home/ssm-user/
EMRを作成
こちらや、以前に載せたAmazon EMRの入門チュートリアルを試してみたを参考にEMRクラスタを作成します。
EMRクラスターを起動
-
下記を入力し、「クラスターを作成」をクリックします。
EMR Studio サービスロールを作成する
各 EMR Studio は、Studio が他のAWSのサービスと対話できるようにするアクセス許可を備えた IAM ロールを使用する。
-
信頼ポリシーを使用してサービスロールを作成します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "elasticmapreduce.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "XXXXXXXXXX" }, "ArnLike": { "aws:SourceArn": "arn:aws:elasticmapreduce:us-west-2:XXXXXX:*" } } } ] }
-
IAMポリシーを作成し、アタッチします。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEMRReadOnlyActions", "Effect": "Allow", "Action": [ "elasticmapreduce:ListInstances", "elasticmapreduce:DescribeCluster", "elasticmapreduce:ListSteps" ], "Resource": "*" }, { "Sid": "AllowEC2ENIActionsWithEMRTags", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterfacePermission", "ec2:DeleteNetworkInterface" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ], "Condition": { "StringEquals": { "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true" } } }, { "Sid": "AllowEC2ENIAttributeAction", "Effect": "Allow", "Action": [ "ec2:ModifyNetworkInterfaceAttribute" ], "Resource": [ "arn:aws:ec2:*:*:instance/*", "arn:aws:ec2:*:*:network-interface/*", "arn:aws:ec2:*:*:security-group/*" ] }, { "Sid": "AllowEC2SecurityGroupActionsWithEMRTags", "Effect": "Allow", "Action": [ "ec2:AuthorizeSecurityGroupEgress", "ec2:AuthorizeSecurityGroupIngress", "ec2:RevokeSecurityGroupEgress", "ec2:RevokeSecurityGroupIngress", "ec2:DeleteNetworkInterfacePermission" ], "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true" } } }, { "Sid": "AllowDefaultEC2SecurityGroupsCreationWithEMRTags", "Effect": "Allow", "Action": [ "ec2:CreateSecurityGroup" ], "Resource": [ "arn:aws:ec2:*:*:security-group/*" ], "Condition": { "StringEquals": { "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true" } } }, { "Sid": "AllowDefaultEC2SecurityGroupsCreationInVPCWithEMRTags", "Effect": "Allow", "Action": [ "ec2:CreateSecurityGroup" ], "Resource": [ "arn:aws:ec2:*:*:vpc/*" ], "Condition": { "StringEquals": { "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true" } } }, { "Sid": "AllowAddingEMRTagsDuringDefaultSecurityGroupCreation", "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:*:*:security-group/*", "Condition": { "StringEquals": { "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true", "ec2:CreateAction": "CreateSecurityGroup" } } }, { "Sid": "AllowEC2ENICreationWithEMRTags", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ], "Condition": { "StringEquals": { "aws:RequestTag/for-use-with-amazon-emr-managed-policies": "true" } } }, { "Sid": "AllowEC2ENICreationInSubnetAndSecurityGroupWithEMRTags", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface" ], "Resource": [ "arn:aws:ec2:*:*:subnet/*", "arn:aws:ec2:*:*:security-group/*" ], "Condition": { "StringEquals": { "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true" } } }, { "Sid": "AllowAddingTagsDuringEC2ENICreation", "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:*:*:network-interface/*", "Condition": { "StringEquals": { "ec2:CreateAction": "CreateNetworkInterface" } } }, { "Sid": "AllowEC2ReadOnlyActions", "Effect": "Allow", "Action": [ "ec2:DescribeSecurityGroups", "ec2:DescribeNetworkInterfaces", "ec2:DescribeTags", "ec2:DescribeInstances", "ec2:DescribeSubnets", "ec2:DescribeVpcs" ], "Resource": "*" }, { "Sid": "AllowSecretsManagerReadOnlyActionsWithEMRTags", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "arn:aws:secretsmanager:*:*:secret:*", "Condition": { "StringEquals": { "aws:ResourceTag/for-use-with-amazon-emr-managed-policies": "true" } } }, { "Sid": "AllowWorkspaceCollaboration", "Effect": "Allow", "Action": [ "iam:GetUser", "iam:GetRole", "iam:ListUsers", "iam:ListRoles", "sso:GetManagedApplicationInstance", "sso-directory:SearchUsers" ], "Resource": "*" }, { "Sid": "AllowWorkspaceCollaboration", "Effect": "Allow", "Action": [ ], "Resource": "*" }, { "Sid": "S3Access", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:GetEncryptionConfiguration", "s3:ListBucket", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::{バケット}", "arn:aws:s3:::{バケット}/*" ] } ] }
-
上記のIAMロールに対して、アクセス権をつけるため、S3バケットのバケットポリシーを修正します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{アカウント名}:role/EMR_Studio_role"
},
"Action": [
"s3:GetEncryptionConfiguration",
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::{バケット名}",
"arn:aws:s3:::{バケット名}/*"
]
}
]
}
EMR Studio の作成
-
EMR Studioの画面で下記を入力し、「Studioを作成」をクリックします。
Amazon EMR Studio を使用する
EMR Studio Workspace の作成
-
EMR Studioのページで、Studio アクセスURLをクリックします。別ウィンドウ(タブ)で EMR Studioが立ち上がります。
-
Workspace nameを入力し、「Create Workspace」をクリックします。※その他項目はデフォルトで全画面で入力したEMR Studioの設定が引き継がれています。
タグ付け
上記で作成した、IAMポリシーにあるように、for-use-with-amazon-emr-managed-policies
:true
を下記のリソースに、タグを付ける。
- VPC
- サブネット
- EMR Studioのセキュリティグループ
Workspacesの起動
クラスターを Workspace にアタッチする
Notebookの実行
PySparkのノートブックを試す
Sparkを実行
【小ネタ】Glue Sparkのメモを元に、Sparkをノートブックで動かしてみます。
createDataFrameを使用してデータセットを作成する
-
下記をセルに入力し実行します。
t = (0,10,) list=[] for i in range(100): list.append(t) df = spark.createDataFrame(list) df.show()
-
別タブで、History Serverが確認できました。「Show incomplete applications」をクリックします。
考察
今回は、EMR クラスタを起動し、EMR Studioでアタッチして使用してみました。Glue Studioなどと同じ様にインタラクティブに使用できる事がわかりました。
次回以降は、下記の内容を試してみたいと思います。
- CLIからNotebookを起動
- Git ベースのサービスとの連携
参考