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

AWS Batch - How to access AWS Batch environment variables within python script running inside Docker container

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

FROM python:3
ADD script.py / 
EXPOSE 80
RUN pip install boto3
RUN pip install uuid
ENTRYPOINT ["python","./script.py"]

这是 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

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

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

Status reasonEssential container in task exited

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

AWS 通过 job definition parameters 提供 docker env 配置,您在其中指定:

"environment" : [
    { "AWS_BATCH_JOB_ARRAY_INDEX" : "string"},
]

这将变成docker env参数:

$ docker run --env AWS_BATCH_JOB_ARRAY_INDEX=string $container $cmd

因此可以accessed通过:

import os

job_id = os.environ['AWS_BATCH_JOB_ARRAY_INDEX']

但请注意,如果您以这种方式传递敏感数据,以纯文本形式传递凭据是不明智的。相反,在这种情况下,您可能想要创建一个 compute environment.