翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon EKS AWS Batch での の開始方法
AWS Batch on Amazon EKS は、バッチワークロードを既存の Amazon EKS クラスターにスケジューリングおよびスケーリングするためのマネージドサービスです。ユーザーに代わって Amazon EKS クラスターのライフサイクルオペレーションを作成、管理、または実行 AWS Batch しません。 AWS Batch orchestration は、 によって管理されるノードをスケールアップおよびスケールダウン AWS Batch し、それらのノードでポッドを実行します。
AWS Batch は、Amazon EKS クラスター内の AWS Batch コンピューティング環境に関連付けられていないノード、自動スケーリングノードグループ、またはポッドのライフサイクルには影響しません。が効果的に動作 AWS Batch するには、サービスにリンクされたロールに、既存の Amazon EKS クラスターでKubernetesロールベースのアクセスコントロール (RBAC) アクセス許可が必要です。詳細については、「Kubernetes ドキュメント」の「RBAC 認可を使用する
AWS Batch には、ポッドを AWS Batch ジョブとしてスコープできるKubernetes名前空間が必要です。 AWS Batch ポッドを他のクラスターワークロードから分離するには、専用の名前空間を使用することをお勧めします。
AWS Batch に RBAC アクセスが付与され、名前空間が確立されたら、CreateComputeEnvironment API オペレーションを使用して、その Amazon EKS クラスターを AWS Batch コンピューティング環境に関連付けることができます。ジョブキューは、この新しい Amazon EKS コンピューティング環境に関連付けることができます。 AWS Batch ジョブは、SubmitJob API オペレーションを使用して Amazon EKS ジョブ定義に基づいてジョブキューに送信されます。 AWS Batch は AWS Batch マネージドノードを起動し、ジョブキューからポッドとしてジョブを AWS Batch コンピューティング環境に関連付けられた EKS Kubernetes クラスターに配置します。
以下のセクションでは、Amazon EKS AWS Batch で をセットアップする方法について説明します。
目次
概要
このチュートリアルでは、、 AWS CLI、kubectl
および を使用して Amazon EKS AWS Batch で を設定する方法を示しますeksctl
。
- 対象者
-
このチュートリアルは、システム管理者と、セットアップ、テスト、デプロイを担当する開発者を対象としています AWS Batch。
- 使用される機能
-
このチュートリアルでは AWS CLI、 を使用して以下を行う方法を示します。
-
Amazon EKS コンピューティング環境を作成して設定する
-
ジョブキューを作成します。
-
ジョブ定義の作成
-
実行するジョブを作成して送信する
-
オーバーライドを使用してジョブを送信する
-
- 所要時間
-
このチュートリアルの所要時間は約 30~40 分です。
- リージョンの制限
-
このソリューションの使用に関連する国や地域の制限はありません。
- リソースの使用コスト
-
AWS アカウントの作成には料金はかかりません。ただし、このソリューションを実装することにより、次の表に記載されるコストの一部またはすべてが発生する可能性があります。
説明 コスト (USD) クラスター時間ごとに課金されます インスタンスによって異なります。「Amazon EKS の料金 」を参照してください。
前提条件
このチュートリアルを開始する前に、 と Amazon EKS リソースの両方を作成および管理するために必要な以下のツール AWS Batch とリソースをインストールして設定する必要があります。
-
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 クラスターで多くの個別のタスクを自動化するために使用するコマンドラインツール。このガイドでは、バージョン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 つのユーザーとして実行する必要があります。
-
権限 — CreateComputeEnvironment API オペレーションを呼び出して Amazon EKS リソースを使用するコンピューティング環境を作成するユーザーには、
eks:DescribeCluster
API オペレーションに対する権限が必要です。 -
AWS アカウント number – AWS アカウント ID を知る必要があります。AWS アカウント 「ID の表示」の指示に従います。
(オプション) CloudWatch – (オプション) オーバーライドを含むジョブを送信するの詳細を確認するには、ログ記録を設定する必要があります。詳細については、「CloudWatch Logs を使用して Amazon EKS ジョブ AWS Batch をモニタリングする」を参照してください。
ステップ 1: 用の Amazon EKS クラスターを作成する AWS Batch
重要
できるだけ簡単かつ迅速に開始するために、このチュートリアルにはデフォルト設定の手順が含まれています。本番稼働用の を作成する前に、すべての設定に精通し、要件を満たす設定にデプロイすることをお勧めします。
前提条件をインストールしたら、 を使用してクラスターを作成する必要がありますeksctl
。クラスターの作成には 10~15 分かかる場合があります。
$
eksctl create cluster --name
my-cluster-name
--regionregion-code
上記のコマンドで、以下を置き換えます。
-
my-cluster-name
をクラスターに使用する名前に置き換えます。 -
region-code
を に置き換え AWS リージョン て、 などの でクラスターを作成しますus-west-2
。
このチュートリアルの後半では、クラスター名とリージョンが必要です。
ステップ 2: 用の Amazon EKS クラスターを準備する AWS Batch
すべての手順を実行する必要があります。
-
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-role
rules: - 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-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 サービスにリンクされたロールにマッピングします。次のコマンドで、 を置き換えます。
-
<your-account-number>
を自分の AWS アカウント 番号に置き換えます。
$
eksctl create iamidentitymapping \ --cluster
my-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 クラスターを指すコンピューティング環境を作成します。
-
クラスターで使用されるサブネットを取得
eksctl get cluster
するためにmy-cluster-name
subnets
を実行する場合。 -
securityGroupIds
パラメータには、Amazon EKS クラスターと同じセキュリティグループを使用できます。このコマンドは、クラスターのセキュリティグループ ID を取得します。$
aws eks describe-cluster \ --name
my-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-environments
My-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-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
--job-nameMy-Eks-Job1
ジョブのステータスを確認するには:
$
aws batch describe-jobs --job
<jobId-from-submit-response>
メモ
-
Amazon EKS リソースでのジョブ実行の詳細については、Amazon EKS ジョブを参照してください。
ステップ 7: ジョブの出力を表示する
ジョブの出力を表示するには、以下を実行します。
-
https://console.aws.amazon.com/batch/
で AWS 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 に関する考慮事項」を参照してください。
ジョブの出力を表示するには、以下を実行します。
-
https://console.aws.amazon.com/batch/
で AWS Batch コンソールを開きます。 -
ナビゲーションペインでジョブを選択します。
-
ジョブキュードロップダウンで、チュートリアル用に作成したジョブキューを選択します。
-
ジョブテーブルには、すべてのジョブとその現在のステータスが一覧表示されます。ジョブのステータスが成功したら、ジョブの名前を選択してジョブの詳細を表示します。
-
詳細ペインで、ストリーム名のログを選択します。ジョブの CloudWatch コンソールが開き、 のメッセージ
hello world
またはカスタムメッセージを含むイベントが 1 つあるはずです。
ステップ 9: チュートリアルリソースをクリーンアップする
Amazon EC2 インスタンスが有効になっている間は課金されます。インスタンスを削除して、料金の発生を停止できます。
作成したリソースを削除するには、次の手順を実行します。
-
https://console.aws.amazon.com/batch/
で AWS Batch コンソールを開きます。 -
ナビゲーションペインで、ジョブキューを選択します。
-
ジョブキューテーブルで、チュートリアル用に作成したジョブキューを選択します。
-
[無効化] を選択します。ジョブキューの状態が無効になったら、削除を選択できます。
-
ジョブキューが削除されたら、ナビゲーションペインでコンピューティング環境を選択します。
-
このチュートリアル用に作成したコンピューティング環境を選択し、Disable を選択します。コンピューティング環境が無効になるまでに 1~2 分かかる場合があります。
-
コンピューティング環境の状態が無効になったら、削除を選択します。コンピューティング環境が削除されるまでに 1~2 分かかる場合があります。
追加リソース
チュートリアルを完了したら、次のトピックを試すことができます。
-
ベストプラクティスの詳細をご覧ください。
-
AWS Batch コアコンポーネントについて説明します。詳細については、「のコンポーネント AWS Batch」を参照してください。
-
で使用できるさまざまなコンピューティング環境について説明します AWS Batch。
-
ジョブキューとそのさまざまなスケジューリングオプションについて説明します。
-
ジョブ定義とさまざまな設定オプションについて説明します。
-
さまざまなタイプのジョブについて説明します。