AWS Batch - 如何在 Docker 容器内运行的 python 脚本中访问 AWS Batch 环境变量

Jam*_*son 1 python docker aws-batch

我有一个 Docker 容器,它在其中执行一个 python 脚本作为入口点。这是 DockerFile

FROM python:3
ADD script.py / 
EXPOSE 80
RUN pip install boto3
RUN pip install uuid
ENTRYPOINT ["python","./script.py"]
Run Code Online (Sandbox Code Playgroud)

这是 Python 脚本:

import boto3
import time
import uuid
import os

guid = uuid.uuid4()
timestr = time.strftime("%Y%m%d-%H%M%S")
job_index = os.environ['AWS_BATCH_JOB_ARRAY_INDEX']

filename = 'latest_test_' + str(guid) + '_.txt'
with open(filename, 'a+') as f:
    data = job_index
    f.write(data)

client = boto3.client(
    's3',
    # Hard coded strings as credentials, not recommended.
    aws_access_key_id='',
    aws_secret_access_key=''
)
response = client.upload_file(filename, 'api-dev-dpstorage-s3', 'docker_data' + filename + '.txt')
with open('response2.txt', 'a+') as f:
    f.write('all done')
    exit
Run Code Online (Sandbox Code Playgroud)

它的设计目的很简单,就是创建一个文件,将作业数组索引写入该文件并将其推送到 S3 存储桶。AWS Batch 的作业数组索引源自预定义的环境变量之一。我已将图像上传到 AWS ECR,并设置了 AWS Batch 来运行包含 10 个数组的作业。这应该执行该作业 10 次,我期望 10 个文件转储到 S3 中,每个文件都包含数组索引工作本身。

如果我不包含环境变量,而只是将值硬编码到文本文件中,则 AWS Batch 作业可以正常工作。如果我包含对 os.environ 的调用来获取变量,作业将失败并出现以下 AWS Batch 错误:

Status reasonEssential container in task exited
Run Code Online (Sandbox Code Playgroud)

我假设我尝试获取环境变量的方式存在问题。有谁知道我如何正确引用作业中定义的内置环境变量之一和/或自定义环境变量?

knh*_*190 5

AWS 通过作业定义参数提供 dockerenv配置,您可以在其中指定:

"environment" : [
    { "AWS_BATCH_JOB_ARRAY_INDEX" : "string"},
]
Run Code Online (Sandbox Code Playgroud)

这将变成docker env参数:

$ docker run --env AWS_BATCH_JOB_ARRAY_INDEX=string $container $cmd
Run Code Online (Sandbox Code Playgroud)

因此可以通过以下方式访问

import os

job_id = os.environ['AWS_BATCH_JOB_ARRAY_INDEX']
Run Code Online (Sandbox Code Playgroud)

但如果您以这种方式传递敏感数据,请注意,以纯文本方式传递凭据并不明智。相反,在这种情况下,您可能想要创建一个计算环境

  • @JamesMatson Batch 计算提供了一个虚拟机(bcs),您可以在 bcs shell 中访问“AWS_BATCH_JOB_ARRAY_INDEX”。但是您的 docker 在 shell 内运行,因此无法访问主机(bcs)shell 变量。现在解释了吗? (2认同)