チュートリアル: Amazon EKS プライベートクラスターで AWS Batch の使用を開始する - AWS Batch

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

チュートリアル: Amazon EKS プライベートクラスターで AWS Batch の使用を開始する

AWS Batch は Amazon Elastic Kubernetes Service (Amazon EKS) クラスターでのバッチワークロードをオーケストレーションするマネージドサービスです。このサービスにはキューイング、依存関係の追跡、ジョブの再試行と優先順位の管理、ポッド管理、ノードスケーリングが含まれます。この機能により、既存のプライベート Amazon EKS クラスターを AWS Batch に接続して、ジョブを大規模に実行できます。eksctl (Amazon EKS のコマンドラインインターフェイス)、AWS コンソール、AWS Command Line Interface を使用して、プライベート Amazon EKS クラスターを他のすべての必要なリソースと共に作成できます。AWS Batch でのプライベート Amazon EKS クラスターのサポートは、AWS Batch を利用できる商用 AWS リージョンで一般に提供されています。

Amazon EKS プライベート専用クラスターにはインバウンド/アウトバウンドのインターネットアクセスがなく、プライベートサブネットのみがあります。他の AWS サービスへのプライベートアクセスを有効にするには Amazon VPC エンドポイントを使用します。eksctl は既存の Amazon VPC とサブネットを使用した完全なプライベートクラスターの作成をサポートします。eksctl はまた、提供された Amazon VPC に Amazon VPC エンドポイントを作成し、提供されたサブネットのルートテーブルを変更します。

eksctl はメインルートテーブルを変更しないため、各サブネットには明示的に関連付けられたルートテーブルが必要です。クラスターは Amazon VPC 内のコンテナレジストリからイメージを取得する必要があります。Amazon VPC 内に Amazon Elastic Container Registry を作成し、そこにコンテナイメージをコピーしてノードの取得元にすることもできます。詳細については、「あるリポジトリから別のリポジトリにコンテナイメージをコピーする」を参照してください。Amazon ECR のプライベートリポジトリの使用を開始するには、「Amazon ECR private repositories」を参照してください。

必要に応じて、Amazon ECR を使用してプルスルーキャッシュルールを作成することもできます。外部パブリックレジストリのプルスルーキャッシュルールを作成したら、Amazon ECR プライベートレジストリの URI を使用して、その外部パブリックレジストリからイメージをプルできます。その後、Amazon ECR でリポジトリが作成され、イメージがキャッシュされます。キャッシュされたイメージが Amazon ECR プライベートレジストリ URI を使用してプルされると、Amazon ECR はリモートレジストリをチェックしてイメージの新しいバージョンがあるかどうかを確認し、24 時間ごとに最大 1 回、プライベートレジストリを更新します。

前提条件

このチュートリアルを開始する前に、AWS Batch と Amazon EKS リソースの両方を作成して管理する上で必要な次のツールとリソースを、インストールおよび設定しておく必要があります。また、必要なすべてのリソース (VPC、サブネット、ルートテーブル、VPC エンドポイント、Amazon EKS クラスターなど) も作成する必要があります。AWS CLI を使用する必要があります。

  • 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 のインストールまたは更新を参照してください。

  • eksctl – Amazon EKS クラスターで多くの個別のタスクを自動化するために使用するコマンドラインツール。このガイドでは、バージョン 0.115.0 以降の使用を想定しています。詳細については、Amazon EKS ユーザーガイドのeksctl のインストールまたは更新を参照してください。

  • AWS Identity and Access Management (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 は、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:DescribeClustereks:ListClusters の両方に対する権限が必要です。

  • サンプルの eksctl 設定ファイルを使用して us-east-1 リージョンにプライベート EKS クラスターを作成します。

    kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 availabilityZones: - us-east-1a - us-east-1b - us-east-1d managedNodeGroups: privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false

    eksctl create cluster -f clusterConfig.yaml のコマンドを使用してリソースを作成します。

  • バッチマネージド型のノードはすべて、必要な VPC インターフェイスエンドポイントを持つサブネットにデプロイする必要があります。詳細については、「プライベートクラスターの要件」を参照してください。

AWS Batch の EKS クラスターを準備する

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

  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 はノードとポッドを監視したり、ロールをバインドしたりできるようになります。これを Amazon 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" \ --username aws-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-the-image-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_PROGRESSIVESPOT_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 コンピューティング環境のメンテナンスは共同責任です。詳細については「Amazon EKS のセキュリティ」をご参照ください。

重要

処理を進める前に、コンピューティング環境が正常であることを確認することが重要です。これには 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

ジョブ定義の作成

ジョブ定義のイメージフィールドに、パブリック ECR リポジトリのイメージへのリンクではなく、プライベート ECR リポジトリに保存されているイメージへのリンクを指定します。以下はジョブ定義の例です。

$ cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "account-id.dkr.ecr.region.amazonaws.com/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

kubectl コマンドを実行するには Amazon EKS クラスターへのプライベートアクセスが必要です。つまり、クラスター API サーバーへのすべてのトラフィックは、クラスターの VPC または接続されたネットワーク内から送信する必要があります。

ジョブを送信する

$ 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>
メモ
  • 単一のコンテナジョブのみがサポートされます。

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

トラブルシューティング

AWS Batch によって起動されたノードが、イメージを保存する Amazon ECR リポジトリ (またはその他の任意のリポジトリ) にアクセスできない場合、ジョブは STARTING の状態のままになる可能性があります。これは、ポッドがイメージをダウンロードして AWS Batch のジョブを実行できないことによります。AWS Batch によって起動されたポッド名をクリックするとエラーメッセージが表示され、問題を確認できます。エラーメッセージは次のようになります。

Failed to pull image "public.ecr.aws/amazonlinux/amazonlinux:2": rpc error: code = Unknown desc = failed to pull and unpack image "public.ecr.aws/amazonlinux/amazonlinux:2": failed to resolve reference "public.ecr.aws/amazonlinux/amazonlinux:2": failed to do request: Head "https://public.ecr.aws/v2/amazonlinux/amazonlinux/manifests/2": dial tcp: i/o timeout

その他の一般的なトラブルシューティングのシナリオについては、「AWS Batch のトラブルシューティング」を参照してください。pod-status に基づくトラブルシューティングについては、「How do I troubleshoot the pod status in Amazon EKS?」を参照してください。