Amazon EKS で AWS Batch のご利用開始にあたって
Amazon EKS における AWS Batch は、既存の Amazon EKS クラスターにバッチワークロードをスケジュールおよびスケーリングするためのマネージドサービスです。AWS Batch が、ユーザーに代わって Amazon EKS クラスターの作成、管理、ライフサイクル操作を行うことはありません。AWS Batch オーケストレーションは、AWS Batch が管理するノードのスケールアップとスケールダウンを行い、それらのノード上でポッドを実行します。
AWS Batch は、Amazon EKS クラスター内の AWS Batch コンピューティング環境に関連付けられていないノード、自動スケーリングノードグループ、またはポッドライフサイクルには影響しません。AWS Batch を効果的に動作させるには、そのサービスにリンクされたロールに、既存の Amazon EKS クラスター内における Kubernetes ロールベースのアクセス制御 (RBAC) 権限が必要になります。詳細については、「Kubernetes ドキュメント」の「RBAC 認可を使用する
AWS Batch には、ポッドを Kubernetes ジョブとしてスコープできる AWS Batch 名前空間が必要です。AWS Batch ポッドを他のクラスターワークロードから分離するために、専用の名前空間を使用することをお勧めします。
AWS Batch に RBAC アクセス権が付与され、名前空間が確立されたら、CreateComputeEnvironment API オペレーションを使用してその Amazon EKS クラスターを AWS Batch コンピューティング環境に関連付けることができます。ジョブキューをこの新しい Amazon EKS コンピューティング環境に関連付けることができます。AWS Batch ジョブは、SubmitJob API オペレーションを使用して Amazon EKS ジョブ定義に基づいてジョブキューに送信されます。次に、AWS Batch は AWS Batch マネージドノードを起動し、ジョブキューにあるジョブを Kubernetes ポッドとして AWS Batch コンピューティング環境に関連付けられた EKS クラスターに配置します。
以下のセクションでは、Amazon EKS で AWS Batch を設定する方法について説明します。
目次
概要
このチュートリアルでは、AWS CLI、kubectl、eksctl を使用して Amazon EKS で AWS Batch を設定する方法について説明します。
- 対象者
-
このチュートリアルは、AWS Batch のセットアップ、テスト、デプロイを担当するシステム管理者とデベロッパーを対象としています。
- 使用される機能
-
このチュートリアルでは、AWS CLI を使用して以下を行う方法について説明します。
-
Amazon EKS コンピューティング環境を作成して設定する
-
ジョブキューの作成。
-
ジョブ定義の作成
-
ジョブを作成して実行する
-
オーバーライドを含むジョブを送信する
-
- 所要時間
-
このチュートリアルは完了までに約 30~40 分かかります。
- リージョン別制限
-
このソリューションの使用に関連する国やリージョン別の制限はありません。
- リソース使用量のコスト
-
AWS アカウントを作成するための料金はかかりません。ただし、このソリューションを実装することにより、次の表に記載されるコストの一部またはすべてが発生する可能性があります。
説明 コスト (USD) クラスター時間ごとに課金されます インスタンスによって異なります。「Amazon EKS の料金 」を参照してください。
前提条件
このチュートリアルを開始する前に、AWS Batch と Amazon EKS リソースの両方を作成して管理する上で必要な次のツールとリソースを、インストールおよび設定しておく必要があります。
-
AWS CLI – Amazon EKS など AWS のサービスを操作するためのコマンドラインツールです。このガイドでは、バージョン 2.8.6 以降または 1.26.0 以降の使用を想定しています。詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS CLI のインストール、更新、およびアンインストール」を参照してください。AWS CLI のインストール後は、設定も行っておくことをお勧めします。詳細については、AWS Command Line Interface ユーザーガイドの
aws configureを使用したクイック設定を参照してください。 -
kubectl- Kubernetes クラスターを操作するためのコマンドラインツール。このガイドでは、バージョン1.23以降の使用を想定しています。詳細については、「Amazon EKS ユーザーガイド」の「kubectlのインストールまたは更新」を参照してください。 -
– Amazon EKS クラスターで多くの個別のタスクを自動化するために使用するコマンドラインツール。このガイドでは、バージョンeksctl0.115.0以降の使用を想定しています。詳細については、「Amazon EKS ユーザーガイド」の「のインストールまたは更新」を参照してください。eksctl -
IAM からの必要なアクセス許可 – ここで使用する IAM セキュリティプリンシパルには、Amazon EKS の IAM ロールおよびサービスにリンクされたロール、CloudFormation、ならびに VPC とその関連リソースを操作するための権限が必要となります。詳細については、「IAM ユーザーガイド」の「Actions, resources, and condition keys for Amazon Elastic Kubernetes Service」と「サービスにリンクされたロールの作成」を参照してください。このガイドのすべてのステップは 1 つのユーザーとして実行する必要があります。
-
権限 — CreateComputeEnvironment API オペレーションを呼び出して Amazon EKS リソースを使用するコンピューティング環境を作成するユーザーには、
eks:DescribeClusterAPI オペレーションに対する権限が必要です。 -
AWS アカウント 番号 – AWS アカウント ID を把握する必要があります。「AWS アカウント ID の表示」の指示に従います。
(オプション) CloudWatch – (オプション) [オーバーライドを含むジョブを送信する] の詳細を確認するには、ログ記録を設定する必要があります。詳細については、「CloudWatch Logs を使用して Amazon EKS ジョブにおける AWS Batch をモニタリングする」を参照してください。
ステップ 1: AWS Batch の Amazon EKS クラスターを作成する
重要
可能な限りシンプルかつ迅速に使用を開始するため、このチュートリアルでは、デフォルトの設定で作成するステップについて説明します。本番での使用に向けて作成する前に、すべての設定内容に習熟した上で、要件を満たす設定でデプロイすることをお勧めします。
前提条件をインストールしたら、eksctl を使用してクラスターを作成する必要があります。クラスターの作成には 10~15 分かかる場合があります。
$eksctl create cluster --namemy-cluster-name--regionregion-code
上記のコマンドでは:
-
my-cluster-nameは、使用したいクラスターの名前に置き換えます。 -
region-codeは AWS リージョン に置き換え、us-west-2などでクラスターを作成します。
このチュートリアルの後半では、クラスター名とリージョンが必要です。
AWS Batch の Amazon EKS クラスターを準備する
すべての手順を実行する必要があります。
-
AWS Batch ジョブ専用の名前空間を作成する
kubectlを使用して新しい名前空間を作成します。$namespace=my-aws-batch-namespace$cat - <<EOF | kubectl create -f - { "apiVersion": "v1", "kind": "Namespace", "metadata": { "name": "${namespace}", "labels": { "name": "${namespace}" } } } EOF出力:
namespace/my-aws-batch-namespace created -
ロールベースアクセス制御 (RBAC) を有効にします。
kubectlを使用して、クラスターの Kubernetes ロールを作成すると、AWS Batch はノードとポッドを監視したり、ロールをバインドしたりできるようになります。これを EKS クラスターごとに 1 回実行する必要があります。$cat - <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name:aws-batch-cluster-rolerules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list"] - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["daemonsets", "deployments", "statefulsets", "replicasets"] verbs: ["get", "list", "watch"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles", "clusterrolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name:aws-batch-cluster-role-bindingsubjects: - kind: User name:aws-batchapiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name:aws-batch-cluster-roleapiGroup: rbac.authorization.k8s.io EOF出力:
clusterrole.rbac.authorization.k8s.io/aws-batch-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/aws-batch-cluster-role-binding created -
名前空間を対象範囲とする Kubernetes ロールを作成すると、AWS Batch はポッドを管理およびライフサイクルしたり、バインドできるようになります。これは固有の名前空間ごとに 1 回行う必要があります。
$namespace=my-aws-batch-namespace$cat - <<EOF | kubectl apply -f - --namespace "${namespace}" apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name:aws-batch-compute-environment-rolenamespace: ${namespace} rules: - apiGroups: [""] resources: ["pods"] verbs: ["create", "get", "list", "watch", "delete", "patch"] - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get", "list"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name:aws-batch-compute-environment-role-bindingnamespace: ${namespace} subjects: - kind: User name:aws-batchapiGroup: rbac.authorization.k8s.io roleRef: kind: Role name:aws-batch-compute-environment-roleapiGroup: rbac.authorization.k8s.io EOF出力:
role.rbac.authorization.k8s.io/aws-batch-compute-environment-role created rolebinding.rbac.authorization.k8s.io/aws-batch-compute-environment-role-binding created -
Kubernetes
aws-auth設定マップを更新して、前述の RBAC 権限を AWS Batch サービスにリンクされたロールにマップします。以下のコマンドで、下記のような置き換えを行います。
-
<your-account-number>を AWS アカウント 番号に置き換えます。
$eksctl create iamidentitymapping \ --clustermy-cluster-name\ --arn "arn:aws:iam::<your-account-number>:role/AWSServiceRoleForBatch" \ --usernameaws-batch出力:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account-number>:role/AWSServiceRoleForBatch" to auth ConfigMap注記
パス
aws-service-role/batch.amazonaws.com/が、サービスにリンクされたロールの ARN から削除されました。これはaws-auth設定マップに問題があるためです。詳細については、「Roles with paths don't work when the path is included in their ARN in the aws-authconfigmap」を参照してください。 -
ステップ 3: Amazon EKS コンピューティング環境を作成する
AWS Batch コンピューティング環境は、バッチワークロードのニーズを満たすコンピューティングリソースパラメータを定義します。マネージドコンピューティング環境では、AWS Batch はAmazon EKS クラスター内のコンピューティングリソース (Kubernetes ノード) の容量とインスタンスタイプを管理します。これは、コンピューティング環境の作成時に定義するコンピューティングリソースの仕様に基づいています。EC2 オンデマンドインスタンスまたは EC2 スポットインスタンスを選択できます。
AWSServiceRoleForBatch サービスにリンクされたロールが Amazon EKS クラスターにアクセスできるようになったので、AWS Batch リソースを作成できます。まず、Amazon EKS クラスターを指すコンピューティング環境を作成します。
-
subnetsでeksctl get clusterを実行し、クラスターで使用されるサブネットを取得します。my-cluster-name -
securityGroupIdsパラメータには、Amazon EKS クラスターと同じセキュリティグループを使用できます。このコマンドは、クラスターのセキュリティグループ ID を取得します。$aws eks describe-cluster \ --namemy-cluster-name\ --query cluster.resourcesVpcConfig.clusterSecurityGroupId -
instanceRoleは、クラスターの作成時に作成されます。AmazonEKSWorkerNodePolicyポリシーを使用するすべてのエンティティをリストしたinstanceRoleを検索するには:$aws iam list-entities-for-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicyポリシーロールの名前には、
eksctl-を作成したクラスターの名前が含まれます。my-cluster-name-nodegroup-exampleinstanceRoleの ARN を検索するには、以下のコマンドを実行します。$aws iam list-instance-profiles-for-role --role-name eksctl-my-cluster-name-nodegroup-example出力:
INSTANCEPROFILES arn:aws:iam::<your-account-number>:instance-profile/eks-04cb2200-94b9-c297-8dbe-87f12example詳しくは、「Amazon EKS ユーザーガイド」の「Amazon EKS ノード IAM ロールの作成」と「クラスターへの IAM プリンシパルアクセスを有効にする」を参照してください。ポッドネットワークを使用している場合は、「Amazon EKS ユーザーガイド」の「サービスアカウントで IAM ロールを使用するための Kubernetes の Amazon VPC CNI プラグインを設定する」を参照してください。
$cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "My-Eks-CE1", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:region-code:your-account-number:cluster/my-cluster-name", "kubernetesNamespace": "my-aws-batch-namespace" }, "computeResources": { "type": "EC2", "allocationStrategy": "BEST_FIT_PROGRESSIVE", "minvCpus": 0, "maxvCpus": 128, "instanceTypes": [ "m5" ], "subnets": [ "<eks-cluster-subnets-with-access-to-internet-for-image-pull>" ], "securityGroupIds": [ "<eks-cluster-sg>" ], "instanceRole": "<eks-instance-profile>" } } EOF
$aws batch create-compute-environment --cli-input-json file://./batch-eks-compute-environment.json
メモ
-
Amazon EKS コンピューティング環境のメンテナンスは共同責任です。詳細については、「Kubernetes ノードの責任分担」を参照してください。
ステップ 4: ジョブキューを作成してコンピューティング環境をアタッチする
重要
処理を進める前に、コンピューティング環境が正常であることを確認することが重要です。これには DescribeComputeEnvironments API オペレーションを使用できます。
$aws batch describe-compute-environments --compute-environmentsMy-Eks-CE1
status パラメータが INVALID ではないことを確認してください。そうであれば、statusReason パラメータを調べて原因を調べてください。詳細については、「AWS Batch のトラブルシューティング」を参照してください。
この新しいジョブキューに送信されたジョブは、コンピューティング環境に関連付けられた Amazon EKS クラスターに結合された AWS Batch マネージドノードでポッドとして実行されます。
$cat <<EOF > ./batch-eks-job-queue.json { "jobQueueName": "My-Eks-JQ1", "priority": 10, "computeEnvironmentOrder": [ { "order": 1, "computeEnvironment": "My-Eks-CE1" } ] } EOF
$aws batch create-job-queue --cli-input-json file://./batch-eks-job-queue.json
ステップ 5: ジョブ定義を作成する
次のジョブ定義は、ポッドに 60 秒間スリープするように指示します。
$cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "public.ecr.aws/amazonlinux/amazonlinux:2", "command": [ "sleep", "60" ], "resources": { "limits": { "cpu": "1", "memory": "1024Mi" } } } ], "metadata": { "labels": { "environment": "test" } } } } } EOF
$aws batch register-job-definition --cli-input-json file://./batch-eks-job-definition.json
メモ
-
cpuおよびmemoryパラメータには考慮事項があります。詳細については、「Amazon EKS の AWS Batch におけるメモリと vCPU に関する考慮事項」を参照してください。
ステップ 6: ジョブを送信する
新しいジョブを送信するには、以下の AWS CLI コマンドを実行します。
$aws batch submit-job --job-queueMy-Eks-JQ1\ --job-definitionMyJobOnEks_Sleep--job-nameMy-Eks-Job1
ジョブのステータスを確認するには:
$aws batch describe-jobs --job<jobId-from-submit-response>
メモ
-
Amazon EKS リソースでのジョブ実行の詳細については、Amazon EKS ジョブ を参照してください。
ステップ 7: ジョブの出力を表示する
ジョブの出力を表示するには、以下を実行します。
-
AWS Batch コンソールを https://console.aws.amazon.com/batch/
で開きます。 -
ナビゲーションペインで [ジョブ] を選択します。
-
[ジョブキュー] ドロップダウンで、チュートリアル用に作成したジョブキューを選択します。
-
[ジョブ] テーブルには、すべてのジョブとその現在のステータスが一覧表示されます。ジョブの [ステータス] が [成功] したら、ジョブの [名前]、
[My-Eks-JQ1]を選択してジョブの詳細を表示します。 -
[詳細] ペインでは、[開始時刻] と [停止時刻] を 1 分間隔で指定する必要があります。
ステップ 8: (オプション) オーバーライドを含むジョブを送信する
このジョブは、コンテナに渡されたコマンドを上書きします。AWS Batch は、ジョブの完了後にポッドを積極的にクリーンアップして、Kubernetes に対する負荷を軽減します。ジョブの詳細を確認するには、ログ記録を設定する必要があります。詳細については、「CloudWatch Logs を使用して Amazon EKS ジョブにおける AWS Batch をモニタリングする」を参照してください。
$cat <<EOF > ./submit-job-override.json { "jobName": "EksWithOverrides", "jobQueue": "My-Eks-JQ1", "jobDefinition": "MyJobOnEks_Sleep", "eksPropertiesOverride": { "podProperties": { "containers": [ { "command": [ "/bin/sh" ], "args": [ "-c", "echo hello world" ] } ] } } } EOF
$aws batch submit-job --cli-input-json file://./submit-job-override.json
メモ
-
操作の詳細を把握しやすくするには、Amazon EKS コントロールプレーンのログ記録を有効にします。詳細については、「Amazon EKS ユーザーガイド」の「Amazon EKS コントロールプレーンのログ」を参照してください。
-
Daemonsets と kubelets オーバーヘッドは、使用可能な vCPU とメモリのリソース、特にスケーリングとジョブの配置に影響します。詳細については、「Amazon EKS の AWS Batch におけるメモリと vCPU に関する考慮事項」を参照してください。
ジョブの出力を表示するには、以下を実行します。
-
AWS Batch コンソールを https://console.aws.amazon.com/batch/
で開きます。 -
ナビゲーションペインで [ジョブ] を選択します。
-
[ジョブキュー] ドロップダウンで、チュートリアル用に作成したジョブキューを選択します。
-
[ジョブ] テーブルには、すべてのジョブとその現在のステータスが一覧表示されます。ジョブの [ステータス] が [成功] であれば、ジョブの [名前] を選択してジョブの詳細を表示します。
-
[詳細] ペインで、ログストリームの名前を選択します。ジョブの CloudWatch コンソールが開き、
hello worldの [メッセージ] またはカスタムメッセージを含むイベントが 1 つあるはずです。
ステップ 9: チュートリアルのリソースをクリーンアップする
Amazon EC2 インスタンスが有効になっている間は課金されます。インスタンスを削除して、料金の発生を停止できます。
作成したリソースを削除するには、次の作業を行います。
-
AWS Batch コンソールを https://console.aws.amazon.com/batch/
で開きます。 -
ナビゲーションペインで [ジョブキュー] を選択します。
-
[ジョブキュー] テーブルで、チュートリアル用に作成したジョブキューを選択します。
-
[無効化] を選択します。ジョブキューの [状態] が無効になったら、[削除] を選択できます。
-
ジョブキューが削除されたら、ナビゲーションペインで [コンピューティング環境] を選択します。
-
このチュートリアル用に作成したコンピューティング環境を選択し、[無効化] を選択します。コンピューティング環境が無効になるまでに 1~2 分かかる場合があります。
-
コンピューティング環境の [状態] が無効になったら、[削除] を選択します。コンピューティング環境が削除されるまでに 1~2 分かかる場合があります。
その他のリソース
チュートリアルが完了したら、次のトピックを試すことができます。
-
ベストプラクティスについて詳しく説明します。
-
AWS Batch コアコンポーネントについて説明します。詳細については、「AWS Batch のコンポーネント」を参照してください。
-
AWS Batch で使用できるさまざまなコンピューティング環境について説明します。
-
[ジョブキュー] とそのさまざまなスケジューリングオプションについて詳しく説明します。
-
[ジョブ定義] とそのさまざまな設定オプションについて詳しく説明します。
-
さまざまなタイプの [ジョブ] について詳しく説明します。