AWS Batch on EKS Team¶
The AWS Batch on EKS Team
extends the ApplicationTeam
and allows the Batch on EKS team to manage the namespace where the Batch Jobs are deployed. This team MUST be used in conjuction with EMR on EKS AddOn.
The AWS Batch on EKS Team allows you to create a Compute Environment and a job queue to attach to the compute environment. Job queues are where jobs are submitted, and where they reside until they can be scheduled in the compute environment.
Usage¶
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import * as blueprints from '@aws-quickstart/eks-blueprints';
const app = new cdk.App();
const addOn = new blueprints.addons.AwsBatchAddOn();
const batchTeam: BatchEksTeamProps = {
name: 'batch-a',
namespace: 'aws-batch',
envName: 'batch-a-comp-env',
computeResources: {
envType: BatchEnvType.EC2,
allocationStrategy: BatchAllocationStrategy.BEST,
priority: 10,
minvCpus: 0,
maxvCpus: 128,
instanceTypes: ["m5", "t3.large"]
},
jobQueueName: 'team-a-job-queue',
};
const blueprint = blueprints.EksBlueprint.builder()
.version("auto")
.addOns(addOn)
.teams(new blueprints.BatchEksTeam(batchTeam))
.build(app, 'my-stack-name');
Create a Job definition¶
Once you deploy the addon and the team, to run a batch job on EKS, you must first define a job. AWS Batch job definitions specify how jobs are to be run. The following is an example job definition you can set using AWS CLI:
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"
}
}
}
]
}
}
}
EOF
aws batch register-job-definition --cli-input-json file://./batch-eks-job-definition.json
Submit a Job¶
Using the job definition, you can define and deploy a specific job using the following example AWS CLI command:
aws batch submit-job --job-queue team-a-job-queue \
--job-definition MyJobOnEks_Sleep --job-name My-Eks-Job1
You will get an output that lists the Job ID:
{
"jobArn": "arn:aws:batch:us-west-2:123456789012:job/9518c9eb-b261-4732-a38d-54caf1d22229",
"jobName": "My-Eks-Job1",
"jobId": "9518c9eb-b261-4732-a38d-54caf1d22229"
}
Verify Job completion¶
You can see the job by running the following command:
aws batch describe-jobs --job <jobId-from-submit-response>
{
"jobs": [
{
"jobArn": "arn:aws:batch:us-west-2:123456789012:job/9518c9eb-b261-4732-a38d-54caf1d22229",
"jobName": "My-Eks-Job1",
"jobId": "9518c9eb-b261-4732-a38d-54caf1d22229",
"jobQueue": "arn:aws:batch:us-west-2:123456789012:job-queue/team-a-job-queue",
"status": "RUNNABLE",
"attempts": [],
"createdAt": 1676581820093,
"dependsOn": [],
"jobDefinition": "arn:aws:batch:us-west-2:123456789012:job-definition/MyJobOnEks_Sleep:1",
"parameters": {},
"tags": {},
"platformCapabilities": [],
"eksProperties": {
"podProperties": {
"hostNetwork": true,
"containers": [
{
"image": "public.ecr.aws/amazonlinux/amazonlinux:2",
"command": [
"sleep",
"60"
],
"args": [],
"env": [],
"resources": {
"limits": {
"memory": "1024Mi",
"cpu": "1"
}
},
"volumeMounts": []
}
],
"volumes": []
}
},
"eksAttempts": []
}
]
}
After a while, you can check that the pod has been created (and eventually deleted after job completion) under the aws-batch
namespace to run the job:
kubectl get pod -n aws-batch
You can also check that the job has been completed by running the describe job command again and seeing the output. There should be description of the pod and node assignment for the job under eksAttempts
:
.......................
"eksAttempts": [
{
"containers": [
{
"exitCode": 0,
"reason": "Completed"
}
],
"podName": "aws-batch.fa024ec9-4232-3e82-b09b-4ba6ba396ec2",
"nodeName": "ip-10-0-81-102.us-west-2.compute.internal",
"startedAt": 1676581976000,
"stoppedAt": 1676582036000
}
]
.......................