翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
チュートリアル: 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 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 ユーザーガイド」の「Quick configuration with
aws configure
」を参照してください。 -
kubectl
- Kubernetes クラスターを操作するためのコマンドラインツール。このガイドでは、バージョン1.23
以降の使用を想定しています。詳細については、Amazon EKS ユーザーガイドのkubectl
のインストールまたは更新を参照してください。 -
– Amazon EKS クラスターで多くの個別のタスクを自動化するために使用するコマンドラインツール。このガイドでは、バージョンeksctl
0.115.0
以降の使用を想定しています。詳細については、Amazon EKS ユーザーガイドの
のインストールまたは更新を参照してください。eksctl
-
IAM からの必要なアクセス許可 – ここで使用する IAM セキュリティプリンシパルには、Amazon EKS の IAM ロールおよびサービスにリンクされたロール、AWS CloudFormation、ならびに VPC とその関連リソースを操作するための権限が必要となります。詳細については、「IAM ユーザーガイド」の「Actions, resources, and condition keys for Amazon Elastic Kubernetes Service」と「サービスにリンクされたロールの作成」を参照してください。このガイドのすべての手順は、1 つのユーザーとして実行する必要があります。
-
EKS クラスターの作成 — 詳細については、「Amazon EKS ユーザーガイド」の「Amazon EKS -
eksctl
の使用を開始する」を参照してください。注記
AWS Batch は、パブリックアクセスが可能で、パブリックインターネットにアクセスできる API サーバーエンドポイントを備えた Amazon EKS クラスターのみをサポートします。デフォルトでは、Amazon EKS クラスター API サーバーエンドポイントはパブリックアクセスが可能です。詳細については、Amazon EKS ユーザーガイドの Amazon EKS クラスターエンドポイントアクセスコントロールを参照してください。
注記
AWS Batch は、CoreDNS やその他のデプロイメントポッドにはマネージドノードオーケストレーションを提供しません。CoreDNS が必要な場合は、Amazon EKS ユーザーガイドのCoreDNS Amazon EKS アドオンの追加を参照してください。または、
eksctl create cluster create
を使用してクラスターを作成すると、クラスターにはデフォルトで CoreDNS が含まれています。 -
権限 — CreateComputeEnvironment API オペレーションを呼び出して Amazon EKS リソースを使用するコンピューティング環境を作成するユーザーには、
eks:DescribeCluster
API オペレーションに対する権限が必要です。AWS Management Consoleから Amazon EKS リソースを使用してコンピューティングリソースを作成するには、eks:DescribeCluster
とeks:ListClusters
の両方に対する権限が必要です。
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 回実行する必要があります。注記
RBAC 認可の使用の詳細については、「Kubernetes ドキュメント」の「RBAC 認可を使用する
」を参照してください。 $
cat - <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name:
aws-batch-cluster-role
rules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - 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-binding
subjects: - kind: User name:aws-batch
apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name:aws-batch-cluster-role
apiGroup: 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-role
namespace: ${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-binding
namespace: ${namespace} subjects: - kind: User name:aws-batch
apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name:aws-batch-compute-environment-role
apiGroup: 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 サービスにリンクされたロールにマップします。$
eksctl create iamidentitymapping \ --cluster
my-cluster-name
\ --arn "arn:aws:iam::<your-account>
:role/AWSServiceRoleForBatch" \ --usernameaws-batch
出力:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::
<your-account>
: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」を参照してください。
Amazon EKS コンピュート環境を作成する
AWS Batch コンピューティング環境は、バッチワークロードのニーズを満たすコンピューティングリソースパラメータを定義します。マネージドコンピューティング環境では、AWS Batch はAmazon EKS クラスター内のコンピューティングリソース (Kubernetes ノード) の容量とインスタンスタイプを管理します。これは、コンピューティング環境の作成時に定義するコンピューティングリソースの仕様に基づいています。EC2 オンデマンドインスタンスまたは EC2 スポットインスタンスを選択できます。
AWSServiceRoleForBatch サービスにリンクされたロールが Amazon EKS クラスターにアクセスできるようになったので、AWS Batch リソースを作成できます。まず、Amazon EKS クラスターを指すコンピューティング環境を作成します。
$
cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "
My-Eks-CE1
", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:<region>
:123456789012
:cluster/<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
メモ
-
serviceRole
パラメータは指定しないでください。そうすることで、AWS Batch サービスにリンクされたロールが使用されます。Amazon EKS における AWS Batch では、AWS Batch サービスにリンクされたロールのみがサポートされます。 -
Amazon EKS コンピューティング環境では
BEST_FIT_PROGRESSIVE
、SPOT_CAPACITY_OPTIMIZED
、およびSPOT_PRICE_CAPACITY_OPTIMIZED
配分戦略のみがサポートされます。注記
ほとんどの場合、
SPOT_CAPACITY_OPTIMIZED
ではなくSPOT_PRICE_CAPACITY_OPTIMIZED
を使用することをお勧めします。 -
instanceRole
については、Amazon EKS ユーザーガイドのAmazon EKS ノード IAM ロールの作成とクラスターへの IAM プリンシパルアクセスを有効にするを参照してください。ポッドネットワークを使用している場合は、Amazon EKS ユーザーガイドのサービスアカウントに IAM ロールを使用するための Kubernetes Amazon VPC CNI プラグインの設定を参照してください。 -
subnets
パラメータのサブネットを動作させる方法の 1 つとして、Amazon EKS クラスターの作成時にeksctl
が作成した Amazon EKS マネージドノードグループのパブリックサブネットを使用することができます。それ以外の場合は、イメージをプルできるネットワークパスを持つサブネットを使用します。 -
securityGroupIds
パラメータには、Amazon EKS クラスターと同じセキュリティグループを使用できます。このコマンドは、クラスターのセキュリティグループ ID を取得します。$
eks describe-cluster \ --name
<cluster-name>
\ --query cluster.resourcesVpcConfig.clusterSecurityGroupId -
Amazon EKS コンピューティング環境のメンテナンスは共同責任です。詳細については、「Kubernetes ノードの責任分担」を参照してください。
重要
処理を進める前に、コンピューティング環境が正常であることを確認することが重要です。これには DescribeComputeEnvironments API オペレーションを使用できます。
$
aws batch describe-compute-environments --compute-environments
My-Eks-CE1
status
パラメータが INVALID
ではないことを確認してください。そうであれば、statusReason
パラメータを調べて原因を調べてください。詳細については、「トラブルシューティング AWS Batch」を参照してください。
ジョブキューを作成してコンピューティング環境をアタッチする
$
aws batch describe-compute-environments --compute-environments
My-Eks-CE1
この新しいジョブキューに送信されたジョブは、コンピューティング環境に関連付けられた 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
ジョブ定義を作成する
$
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 EKSAWS BatchのメモリとvCPUに関する考慮事項」を参照してください。
ジョブを送信する
$
aws batch submit-job --job-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
--job-nameMy-Eks-Job1
$
aws batch describe-jobs --job
<jobId-from-submit-response>
メモ
-
単一のコンテナジョブのみがサポートされます。
-
cpu
およびmemory
パラメータに関連するすべての考慮事項をよく理解しておいてください。詳細については、「Amazon EKSAWS BatchのメモリとvCPUに関する考慮事項」を参照してください。 -
Amazon EKS リソースでのジョブ実行の詳細については、Amazon EKS ジョブを参照してください。
(オプション) オーバーライドを含むジョブを送信する
このジョブは、コンテナに渡されたコマンドをオーバーライドします。
$
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
メモ
-
Kubernetes は、ジョブの完了後にポッドを積極的にクリーンアップして、AWS Batch への負荷を軽減します。ジョブの詳細を確認するには、ログ記録を設定する必要があります。詳細については、CloudWatch Logs を使用して Amazon EKS ジョブにおける AWS Batch をモニタリングするを参照してください。
-
操作の詳細を把握しやすくするには、Amazon EKS コントロールプレーンのログ記録を有効にします。詳細については、Amazon EKS ユーザーガイドのAmazon EKS クラスターコントロールプレーンのログ記録を参照してください。
-
Daemonsets と kubelets オーバーヘッドは、使用可能な vCPU とメモリのリソース、特にスケーリングとジョブの配置に影響します。詳細については、Amazon EKSAWS BatchのメモリとvCPUに関する考慮事項を参照してください。