Fargate 任务的环境变量设置

时间:2021-02-18 14:09:40

标签: amazon-web-services aws-lambda environment-variables amazon-ecs aws-fargate

我的 Javascript AWS Lambda 函数中有以下代码片段:

const taskParams = {
    "taskDefinition": workerTaskDefinitionName,
    "launchType": "FARGATE",
    "count": "1",
    "overrides": { 
        "containerOverrides": [ 
           {
              "name": containerName, 
              "environment": [ 
                { 
                    "name": "INPUT_VIDEO_FILE_URL",
                    "value": srcKey
                },
                { 
                    "name": "POSITION_TIME_DURATION",
                    "value": positionTimeDuration
                },
                { 
                    "name":"OUTPUT_THUMBS_FILE_NAME",
                    "value": dstKey
                },
                { 
                    "name":"OUTPUT_S3_PATH",
                    "value": destinationBucket
                }
              ]
           }
        ]
     }
};

try {

    console.log('Starting task...');
    console.log(`  srcBucket=${srcBucket}`);
    console.log(`  srcKey=${srcKey}`);
    console.log(`  positionTimeDuration=${positionTimeDuration}`);
    console.log(`  dstKey=${dstKey}`);
    console.log(`  destinationBucket=${destinationBucket}`);

    ecs.runTask(taskParams, function(err, data) {
        if (err) {
            console.log(err, err.stack); // an error occurred
        } 
        else  {
            console.log(data);           // successful response
            console.log('Successfully ran the task.');
        }
    });
      
} catch(error) {
    console.log('Error running the task.');
    console.log(error);
}

本质上,lambda 正在为 Fargate 容器化任务设置环境并调用该任务。

我有一个占位符 bash 脚本作为容器化任务:

#!/bin/bash

### Environment variables ###
# INPUT_VIDEO_FILE_URL
# POSITION_TIME_DURATION
# OUTPUT_THUMBS_FILE_NAME
# OUTPUT_S3_PATH
echo "INPUT_VIDEO_FILE_URL = ${INPUT_VIDEO_FILE_URL}"
echo "POSITION_TIME_DURATION = ${POSITION_TIME_DURATION}"
echo "OUTPUT_THUMBS_FILE_NAME = ${OUTPUT_THUMBS_FILE_NAME}"
echo "OUTPUT_S3_PATH = ${OUTPUT_S3_PATH}"
#############################

echo "Copying ${OUTPUT_THUMBS_FILE_NAME} to S3 at ${OUTPUT_S3_PATH}/${OUTPUT_THUMBS_FILE_NAME} ..."

echo "Done (dummy bash script)."

在触发 Lambda 函数后检查 Cloudwatch 日志时,我看到 lambda 函数的日志正确记录了预期值。但是,容器化的工作任务日志没有显示作为环境变量覆盖传递的值。

这是 lambda 日志:

START RequestId: ab6e3b4e-f026-4d43-b137-b72dc76e83ad Version: $LATEST
2021-02-18T13:29:19.394Z    ab6e3b4e-f026-4d43-b137-b72dc76e83ad    INFO    Starting task...
2021-02-18T13:29:19.433Z    ab6e3b4e-f026-4d43-b137-b72dc76e83ad    INFO      srcBucket=vxx..x
2021-02-18T13:29:19.433Z    ab6e3b4e-f026-4d43-b137-b72dc76e83ad    INFO      srcKey=small.mp4
2021-02-18T13:29:19.433Z    ab6e3b4e-f026-4d43-b137-b72dc76e83ad    INFO      positionTimeDuration=00:03
2021-02-18T13:29:19.433Z    ab6e3b4e-f026-4d43-b137-b72dc76e83ad    INFO      dstKey=transcoded-small.mp4
2021-02-18T13:29:19.434Z    ab6e3b4e-f026-4d43-b137-b72dc76e83ad    INFO      destinationBucket=arn:aws:s3:::vyyy..y
END RequestId: ab6e3b4e-f026-4d43-b137-b72dc76e83ad
REPORT RequestId: ab6e3b4e-f026-4d43-b137-b72dc76e83ad  Duration: 721.20 ms Billed Duration: 722 ms Memory Size: 128 MB Max Memory Used: 90 MB  Init Duration: 447.57 ms    

这是容器任务日志:

INPUT_VIDEO_FILE_URL = 
POSITION_TIME_DURATION = 
OUTPUT_THUMBS_FILE_NAME = 
OUTPUT_S3_PATH = 
Copying  to S3 at / ...
Done (dummy bash script).

我做错了什么?

1 个答案:

答案 0 :(得分:1)

查看 AWS JavaScript SDK 中的示例,我相信您需要在 name 定义中添加一个 containerOverrides 属性,以匹配容器名称:

"overrides": { 
            "containerOverrides": [ 
               { 
                  "name": "<this-name-should-match-the-container-name>",
                  "environment": [ 
                    { 
                        "name": "INPUT_VIDEO_FILE_URL",
                        "value": srcKey
                    },
                    { 
                        "name": "POSITION_TIME_DURATION",
                        "value": positionTimeDuration
                    },
                    { 
                        "name":"OUTPUT_THUMBS_FILE_NAME",
                        "value": dstKey
                    },
                    { 
                        "name":"OUTPUT_S3_PATH",
                        "value": destinationBucket
                    }
                  ]
               }
            ]
         }

来自the documentation

<块引用>

name —(字符串)接收覆盖的容器的名称。 如果指定了任何覆盖,则此参数是必需的。