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 クラスターを指すコンピューティング環境を作成します。

  • subnetseksctl get cluster my-cluster-name を実行し、クラスターで使用されるサブネットを取得します。

  • 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. [Disable] (無効化) を選択します。ジョブキューの [状態] が無効になったら、[削除] を選択できます。

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

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

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

その他のリソース

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