Amazon EKS AWS Batch での の開始方法 - AWS Batch

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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 とリソースをインストールして設定する必要があります。

ステップ 1: 用の Amazon EKS クラスターを作成する AWS Batch

重要

できるだけ簡単かつ迅速に開始するために、このチュートリアルにはデフォルト設定の手順が含まれています。本番稼働用の を作成する前に、すべての設定に精通し、要件を満たす設定にデプロイすることをお勧めします。

前提条件をインストールしたら、 を使用してクラスターを作成する必要がありますeksctl。クラスターの作成には 10~15 分かかる場合があります。

$ eksctl create cluster --name my-cluster-name --region region-code

上記のコマンドで、以下を置き換えます。

  • my-cluster-name をクラスターに使用する名前に置き換えます。

  • region-code を に置き換え AWS リージョン て、 などの でクラスターを作成しますus-west-2

このチュートリアルの後半では、クラスター名とリージョンが必要です。

ステップ 2: 用の Amazon EKS クラスターを準備する AWS Batch

すべての手順を実行する必要があります。

  1. 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
  2. ロールベースアクセス制御 (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
  3. の名前空間スコープ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
  4. 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" \ --username aws-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-example

    instanceRole 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
メモ

ステップ 6: ジョブを送信する

次の AWS CLI コマンドを実行して、新しいジョブを送信します。

$ aws batch submit-job --job-queue My-Eks-JQ1 \ --job-definition MyJobOnEks_Sleep --job-name My-Eks-Job1

ジョブのステータスを確認するには:

$ aws batch describe-jobs --job <jobId-from-submit-response>
メモ
  • Amazon EKS リソースでのジョブ実行の詳細については、Amazon EKS ジョブを参照してください。

ステップ 7: ジョブの出力を表示する

ジョブの出力を表示するには、以下を実行します。

  1. https://console.aws.amazon.com/batch/ で AWS Batch コンソールを開きます。

  2. ナビゲーションペインでジョブを選択します。

  3. ジョブキュードロップダウンで、チュートリアル用に作成したジョブキューを選択します。

  4. ジョブテーブルには、すべてのジョブとその現在のステータスが一覧表示されます。ジョブのステータス成功したら、ジョブの名前 My-Eks-JQ1 を選択してジョブの詳細を表示します。

  5. 詳細ペインでは、開始時刻停止時刻を 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
メモ

ジョブの出力を表示するには、以下を実行します。

  1. https://console.aws.amazon.com/batch/ で AWS Batch コンソールを開きます。

  2. ナビゲーションペインでジョブを選択します。

  3. ジョブキュードロップダウンで、チュートリアル用に作成したジョブキューを選択します。

  4. ジョブテーブルには、すべてのジョブとその現在のステータスが一覧表示されます。ジョブのステータス成功したら、ジョブの名前を選択してジョブの詳細を表示します。

  5. 詳細ペインで、ストリーム名のログを選択します。ジョブの CloudWatch コンソールが開き、 のメッセージhello worldまたはカスタムメッセージを含むイベントが 1 つあるはずです。

ステップ 9: チュートリアルリソースをクリーンアップする

Amazon EC2 インスタンスが有効になっている間は課金されます。インスタンスを削除して、料金の発生を停止できます。

作成したリソースを削除するには、次の手順を実行します。

  1. https://console.aws.amazon.com/batch/ で AWS Batch コンソールを開きます。

  2. ナビゲーションペインで、ジョブキューを選択します。

  3. ジョブキューテーブルで、チュートリアル用に作成したジョブキューを選択します。

  4. [無効化] を選択します。ジョブキューの状態が無効になったら、削除を選択できます。

  5. ジョブキューが削除されたら、ナビゲーションペインでコンピューティング環境を選択します。

  6. このチュートリアル用に作成したコンピューティング環境を選択し、Disable を選択します。コンピューティング環境が無効になるまでに 1~2 分かかる場合があります。

  7. コンピューティング環境の状態が無効になったら、削除を選択します。コンピューティング環境が削除されるまでに 1~2 分かかる場合があります。

追加リソース

チュートリアルを完了したら、次のトピックを試すことができます。