我试着确认一下AWS Lambda的执行环境(AMI)是否会更新(包括Node.js和Python)

收到关于AWS Lambda执行环境所使用的AMI已更新的通知。

即将发布的AWS Lambda和AWS Lambda@Edge执行环境更新。

AWS Lambda和AWS Lambda@Edge运行在Amazon Linux操作系统分发的顶部,并维护核心操作系统和托管语言运行时的更新。我们正在将Lambda执行环境AMI更新到Amazon Linux的2018.03版本。这个更新的AMI提供了功能、性能、安全性的改进以及应用程序代码可能需要接口更新的包。

根据情况,尽管更新计划已经变更,但据说从2019/6/11开始创建新函数会使用新的执行环境。然而,有时候会在旧环境下执行,因此我进行了调查。

即将到来的AWS Lambda和AWS Lambda@Edge执行环境更新的更新时间表已更新。

2019年6月11日 – 新功能创建:除非已配置了延迟更新层,否则所有新创建的功能都将在新的执行环境中运行。(Google翻译)

假设

    • AWSアカウントがある

 

    • AWS CLIが利用可能

 

    リージョンはバージニア北部( us-east-1 )

Node.js 的意思是一种基于 Chrome V8 引擎的开源、跨平台的 JavaScript 运行环境。

由于Node.js使用Amazon Linux 2作为其10.x版本的基础,因此它不属于本次更新的目标(截至2019/06/20)。

AWS Lambda运行时- AWS Lambda

https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html?icmpid=docs_lambda_rss

AWS Lambda运行时是AWS Lambda的一个功能。您可以通过访问上述链接获取有关AWS Lambda运行时的详细信息。

即将到来的更新将涉及AWS Lambda和AWS Lambda@Edge执行环境。

这不适用于最近宣布的Node.js v10运行时,该运行时目前在Amazon Linux 2上运行。(Google翻译)

创建一个新的函数

使用AWS CLI部署Lambda函数。函数实现如下,在函数内部执行uname -a和cat /etc/system-release命令,以确认AMI的版本。

exports.handler = async (event) => {
    const execSync = require('child_process').execSync;

    const unameResult = execSync('uname -a');
    console.log(unameResult.toString());

    const catResult = execSync('cat /etc/system-release');
    console.log(catResult.toString());

    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ

# 実行ロールの作成
> cat <<EOF >lambda-role-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

> aws iam create-role \
  --role-name check-lambda-environment-role \
  --assume-role-policy-document file://lambda-role-policy.json

{
    "Role": {
        "Path": "/",
        "RoleName": "check-lambda-environment-role",
        "RoleId": "XXXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
        "CreateDate": "2019-06-20T04:01:40Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}


> touch index.js
# 内容は上記のコード

> zip index.zip index.js

> aws lambda create-function \
  --function-name check-nodejs-environment \
  --zip-file fileb://index.zip \
  --handler index.handler \
  --runtime nodejs8.10 \
  --role arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role

{
    "FunctionName": "check-nodejs-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-nodejs-environment",
    "Runtime": "nodejs8.10",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "index.handler",
    "CodeSize": 396,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T02:11:46.450+0000",
    "CodeSha256": "oGABm6ZtX98ncjxUuwiJqhPUul6fdQq3waJcaJqHJiE=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "3b8ee8d9-86ec-4d3a-bbfa-1e4ee0b9482f"
}

一旦部署成功,我会尝试执行该函数。

> aws lambda invoke \
  --function-name check-nodejs-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: 7920dfc4-f7ee-4edc-96ab-15f7e259ad10 Version: $LATEST
2019-06-20T02:24:38.757Z        7920dfc4-f7ee-4edc-96ab-15f7e259ad10    Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

2019-06-20T02:24:38.778Z        7920dfc4-f7ee-4edc-96ab-15f7e259ad10    Amazon Linux AMI release 2018.03

END RequestId: 7920dfc4-f7ee-4edc-96ab-15f7e259ad10
REPORT RequestId: 7920dfc4-f7ee-4edc-96ab-15f7e259ad10  Duration: 24.06 ms      Billed Duration: 100 ms         Memory Size: 128 MB   Max Memory Used: 28 MB

我确认了Amazon Linux AMI release 2018.03已经更新。
接下来我将尝试修改运行时环境为nodejs10.x并进行执行。

> aws lambda update-function-configuration \
  --function-name check-nodejs-environment \
  --runtime nodejs10.x

{
    "FunctionName": "check-nodejs-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-nodejs-environment",
    "Runtime": "nodejs10.x",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "index.handler",
    "CodeSize": 396,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:11:51.718+0000",
    "CodeSha256": "oGABm6ZtX98ncjxUuwiJqhPUul6fdQq3waJcaJqHJiE=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "7b306be7-a56d-431f-95c4-096d37d060b4"
}


> aws lambda invoke \
  --function-name check-nodejs-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: 844951be-8b94-4f69-b678-5fca6b51048b Version: $LATEST
2019-06-20T03:12:27.412Z        844951be-8b94-4f69-b678-5fca6b51048b    INFO    Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
2019-06-20T03:12:27.512Z        844951be-8b94-4f69-b678-5fca6b51048b    INFO    Amazon Linux release 2 (Karoo)
END RequestId: 844951be-8b94-4f69-b678-5fca6b51048b
REPORT RequestId: 844951be-8b94-4f69-b678-5fca6b51048b  Duration: 387.86 ms     Billed Duration: 400 ms         Memory Size: 128 MB   Max Memory Used: 26 MB

我的Amazon Linux 2 (Karoo)版本已经成功更新。接下来,我将将运行环境还原为nodejs8.10并进行执行,这可能会产生一些可疑的行为。

> aws lambda update-function-configuration \
  --function-name check-nodejs-environment \
  --runtime nodejs8.10

{
    "FunctionName": "check-nodejs-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-nodejs-environment",
    "Runtime": "nodejs8.10",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "index.handler",
    "CodeSize": 396,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:15:14.557+0000",
    "CodeSha256": "oGABm6ZtX98ncjxUuwiJqhPUul6fdQq3waJcaJqHJiE=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "4391a559-ba2b-4e70-97f5-b983988099a3"
}


> aws lambda invoke \
  --function-name check-nodejs-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: 8814f1b7-d3c7-46f9-a562-dc55b408e3c2 Version: $LATEST
2019-06-20T03:15:51.173Z        8814f1b7-d3c7-46f9-a562-dc55b408e3c2    Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

2019-06-20T03:15:51.311Z        8814f1b7-d3c7-46f9-a562-dc55b408e3c2    Amazon Linux AMI release 2017.03

END RequestId: 8814f1b7-d3c7-46f9-a562-dc55b408e3c2
REPORT RequestId: 8814f1b7-d3c7-46f9-a562-dc55b408e3c2  Duration: 366.43 ms     Billed Duration: 400 ms         Memory Size: 128 MB   Max Memory Used: 22 MB

亚马逊 Linux AMI 2017.03版已发布。
根据博客文章显示,从2019/06/11开始创建的函数和从2019/06/25开始创建或更新的函数附带了一些条件,所以它们的行为看起来并没有错误。目前,只有新创建的函数才会使用新的执行环境。(截至2019/06/20)

即将推出的AWS Lambda和AWS Lambda@Edge执行环境的更新。

2019年6月11日- 新创建功能:所有新创建的功能将在新的执行环境中运行,除非它们配置了延迟更新层。

2019年6月25日- 现有功能更新:所有新创建或更新的现有功能都将在新的执行环境中运行,除非它们配置了延迟更新层。

我试试选择同意。

根据博客文章中提到的,有一个为本次训练准备的Lambda层,我们可以尝试使用它来创建一个新的执行环境。
据说,如果添加了 arn:aws:lambda:::awslayer:AmazonLinux1803 的Opt-in层,就会创建一个新的执行环境。据说这个层的代码大小为0,并被用作标志。如果我也可以使用这个机制,那会很方便,不知道可行吗?

> aws lambda update-function-configuration \
  --function-name check-nodejs-environment \
  --layers "arn:aws:lambda:::awslayer:AmazonLinux1803"

{
    "FunctionName": "check-nodejs-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-nodejs-environment",
    "Runtime": "nodejs8.10",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "index.handler",
    "CodeSize": 396,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:21:28.575+0000",
    "CodeSha256": "oGABm6ZtX98ncjxUuwiJqhPUul6fdQq3waJcaJqHJiE=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "414d41ec-98db-4588-8d1f-0c77fd50eef0",
    "Layers": [
        {
            "Arn": "arn:aws:lambda:::awslayer:AmazonLinux1803",
            "CodeSize": 0
        }
    ]
}


> aws lambda invoke \
  --function-name check-nodejs-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: dfb209e7-50ef-41b5-b960-60359e4566e4 Version: $LATEST
2019-06-20T03:22:25.570Z        dfb209e7-50ef-41b5-b960-60359e4566e4    Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

2019-06-20T03:22:25.592Z        dfb209e7-50ef-41b5-b960-60359e4566e4    Amazon Linux AMI release 2018.03

END RequestId: dfb209e7-50ef-41b5-b960-60359e4566e4
REPORT RequestId: dfb209e7-50ef-41b5-b960-60359e4566e4  Duration: 49.56 ms      Billed Duration: 100 ms         Memory Size: 128 MB   Max Memory Used: 28 MB

只需一个选项,以下是对原文的中文本地化释义:

确认进行了 opt-in 操作后,我们可以确认 Amazon Linux AMI release 2018.03 将会被执行。
我们最后会将层级去掉以进行确认。

> aws lambda update-function-configuration \
  --function-name check-nodejs-environment \
  --layers []

{
    "FunctionName": "check-nodejs-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-nodejs-environment",
    "Runtime": "nodejs8.10",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "index.handler",
    "CodeSize": 396,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:31:43.734+0000",
    "CodeSha256": "oGABm6ZtX98ncjxUuwiJqhPUul6fdQq3waJcaJqHJiE=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "d1ca3a16-a01e-4f7e-8a30-00646c3c8d56"
}


> aws lambda invoke \
  --function-name check-nodejs-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: 76dd533b-5491-47de-a6f3-4234d1baed7e Version: $LATEST
2019-06-20T03:32:48.012Z        76dd533b-5491-47de-a6f3-4234d1baed7e    Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

2019-06-20T03:32:48.090Z        76dd533b-5491-47de-a6f3-4234d1baed7e    Amazon Linux AMI release 2017.03

END RequestId: 76dd533b-5491-47de-a6f3-4234d1baed7e
REPORT RequestId: 76dd533b-5491-47de-a6f3-4234d1baed7e  Duration: 186.55 ms     Billed Duration: 200 ms         Memory Size: 128 MB   Max Memory Used: 20 MB

我回到了 Amazon Linux AMI release 2017.03。

Python – Python

我也会用Python来确认一下。在Python的情况下,全部都是Amazon Linux(截至2019年6月20日)。

AWS Lambda 运行时 – AWS Lambda
https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html?icmpid=docs_lambda_rss

AWS Lambda 运行时是 AWS Lambda 的一项功能。了解更多信息,请访问以下链接:https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html?icmpid=docs_lambda_rss

创建一个新的函数

使用subprocess模块执行”uname -a”和”cat /etc/system-release”命令。

import json
import subprocess

def lambda_handler(event, context):
    res = subprocess.check_output(['uname', '-a'])
    print(res)

    res2 = subprocess.check_output(['cat', '/etc/system-release'])
    print(res2)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
> touch main.py
# 内容は上記のコード

> zip main.zip main.py

> aws lambda create-function \
  --function-name check-python-environment \
  --zip-file fileb://main.zip \
  --handler main.lambda_handler \
  --runtime python3.7 \
  --role arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role

{
    "FunctionName": "check-python-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-python-environment",
    "Runtime": "python3.7",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "main.lambda_handler",
    "CodeSize": 360,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:39:13.434+0000",
    "CodeSha256": "Ra/oq/0Wx9NILMmLQdYPuD2JjMg6kscBAKJCVm81Fz4=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "21591033-7aa1-4dc2-b977-cd39b2506b8a"
}


> aws lambda invoke \
  --function-name check-python-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: a1567ac2-7973-4495-b036-8e1ff325a6f4 Version: $LATEST
b'Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n'
b'Amazon Linux AMI release 2018.03\n'
END RequestId: a1567ac2-7973-4495-b036-8e1ff325a6f4
REPORT RequestId: a1567ac2-7973-4495-b036-8e1ff325a6f4  Duration: 64.31 ms      Billed Duration: 100 ms         Memory Size: 128 MB   Max Memory Used: 35 MB

我确认了该实例正在使用Amazon Linux AMI Release 2018.03。

尝试更改运行时间

我們將嘗試更改執行環境以確認它是否會成為一個新的運行環境,就像Node.js一樣。

> aws lambda update-function-configuration \
  --function-name check-python-environment \
  --runtime python3.6

{
    "FunctionName": "check-python-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-python-environment",
    "Runtime": "python3.6",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "main.lambda_handler",
    "CodeSize": 360,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:41:48.447+0000",
    "CodeSha256": "Ra/oq/0Wx9NILMmLQdYPuD2JjMg6kscBAKJCVm81Fz4=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "479990ce-9162-4393-b2d9-f7f8bca28605"
}


> aws lambda invoke \
  --function-name check-python-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: 25765907-7d44-4a5a-b414-1ad942a87e62 Version: $LATEST
b'Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n'
b'Amazon Linux AMI release 2018.03\n'
END RequestId: 25765907-7d44-4a5a-b414-1ad942a87e62
REPORT RequestId: 25765907-7d44-4a5a-b414-1ad942a87e62  Duration: 46.01 ms      Billed Duration: 100 ms         Memory Size: 128 MB   Max Memory Used: 26 MB

回到 Amazon Linux AMI release 2018.03 的状态。

> aws lambda update-function-configuration \
  --function-name check-python-environment \
  --runtime python3.7

{
    "FunctionName": "check-python-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-python-environment",
    "Runtime": "python3.7",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "main.lambda_handler",
    "CodeSize": 360,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:43:10.933+0000",
    "CodeSha256": "Ra/oq/0Wx9NILMmLQdYPuD2JjMg6kscBAKJCVm81Fz4=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "82de01a8-a011-49f7-a0c6-adcf08f83161"
}


> aws lambda invoke \
  --function-name check-python-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: 91a53cc6-bd67-418a-b583-b492f3410573 Version: $LATEST
b'Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n'
b'Amazon Linux AMI release 2018.03\n'
END RequestId: 91a53cc6-bd67-418a-b583-b492f3410573
REPORT RequestId: 91a53cc6-bd67-418a-b583-b492f3410573  Duration: 95.78 ms      Billed Duration: 100 ms         Memory Size: 128 MB   Max Memory Used: 21 MB

看起来Node.js的行为是不同的。。。

试试取消选择

我会试着选择退出。请注意,选择退出时Lambda层的ARN将会有所不同。

> aws lambda update-function-configuration \
  --function-name check-python-environment \
  --layers "arn:aws:lambda:::awslayer:AmazonLinux1703"

{
    "FunctionName": "check-python-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-python-environment",
    "Runtime": "python3.7",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "main.lambda_handler",
    "CodeSize": 360,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:45:46.154+0000",
    "CodeSha256": "Ra/oq/0Wx9NILMmLQdYPuD2JjMg6kscBAKJCVm81Fz4=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "7b67d0e1-6c42-4edb-8be8-bbc12ebe46ff",
    "Layers": [
        {
            "Arn": "arn:aws:lambda:::awslayer:AmazonLinux1703",
            "CodeSize": 0
        }
    ]
}


> aws lambda invoke \
  --function-name check-python-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: a44a1cda-fb09-4092-a40a-3b1112c66b3b Version: $LATEST
b'Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n'
b'Amazon Linux AMI release 2017.03\n'
END RequestId: a44a1cda-fb09-4092-a40a-3b1112c66b3b
REPORT RequestId: a44a1cda-fb09-4092-a40a-3b1112c66b3b  Duration: 138.37 ms     Billed Duration: 200 ms         Memory Size: 128 MB   Max Memory Used: 21 MB

确认了 Amazon Linux AMI release 2017.03 可以选择退出。
为了保险起见,我们将尝试去除层级。

> aws lambda update-function-configuration \
  --function-name check-python-environment \
  --layers []

{
    "FunctionName": "check-python-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-python-environment",
    "Runtime": "python3.7",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "main.lambda_handler",
    "CodeSize": 360,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:47:42.043+0000",
    "CodeSha256": "Ra/oq/0Wx9NILMmLQdYPuD2JjMg6kscBAKJCVm81Fz4=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "dfcf4640-bff1-4018-b0d2-b72b25d64be5"
}


> aws lambda invoke \
  --function-name check-python-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: 48048135-8f2c-4fe4-a09c-baffea110561 Version: $LATEST
b'Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n'
b'Amazon Linux AMI release 2017.03\n'
END RequestId: 48048135-8f2c-4fe4-a09c-baffea110561
REPORT RequestId: 48048135-8f2c-4fe4-a09c-baffea110561  Duration: 70.53 ms      Billed Duration: 100 ms         Memory Size: 128 MB   Max Memory Used: 21 MB

嗯嗯嗯。亚马逊 Linux AMI 发布 2017.03 版仍然保持原样。

我尝试选择订阅

因为我很在意,所以最后我会尝试自愿选择并返回。

> aws lambda update-function-configuration \
  --function-name check-python-environment \
  --layers "arn:aws:lambda:::awslayer:AmazonLinux1803"

{
    "FunctionName": "check-python-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-python-environment",
    "Runtime": "python3.7",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "main.lambda_handler",
    "CodeSize": 360,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:49:20.115+0000",
    "CodeSha256": "Ra/oq/0Wx9NILMmLQdYPuD2JjMg6kscBAKJCVm81Fz4=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "1e6a3849-3bb4-4be3-85d9-f2161adcfb88",
    "Layers": [
        {
            "Arn": "arn:aws:lambda:::awslayer:AmazonLinux1803",
            "CodeSize": 0
        }
    ]
}


> aws lambda invoke \
  --function-name check-python-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: fa55a4eb-3181-485f-9096-e8ccee582e09 Version: $LATEST
b'Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n'
b'Amazon Linux AMI release 2018.03\n'
END RequestId: fa55a4eb-3181-485f-9096-e8ccee582e09
REPORT RequestId: fa55a4eb-3181-485f-9096-e8ccee582e09  Duration: 71.20 ms      Billed Duration: 100 ms         Memory Size: 128 MB   Max Memory Used: 21 MB


> aws lambda update-function-configuration \
  --function-name check-python-environment \
  --layers []

{
    "FunctionName": "check-python-environment",
    "FunctionArn": "arn:aws:lambda:us-east-1:xxxxxxxxxxxx:function:check-python-environment",
    "Runtime": "python3.7",
    "Role": "arn:aws:iam::xxxxxxxxxxxx:role/check-lambda-environment-role",
    "Handler": "main.lambda_handler",
    "CodeSize": 360,
    "Description": "",
    "Timeout": 3,
    "MemorySize": 128,
    "LastModified": "2019-06-20T03:50:50.576+0000",
    "CodeSha256": "Ra/oq/0Wx9NILMmLQdYPuD2JjMg6kscBAKJCVm81Fz4=",
    "Version": "$LATEST",
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "fc639f68-98d9-49db-9727-a36978fb3d7e"
}


> aws lambda invoke \
  --function-name check-python-environment \
  --log-type Tail \
  outputfile.txt \
  --query 'LogResult' | tr -d '"' | base64 -D

START RequestId: dc4e13e8-733b-446c-b5a8-d4033baaef7c Version: $LATEST
b'Linux ip-xxx-xxx-xxx-xxx 4.14.123-86.109.amzn1.x86_64 #1 SMP Mon Jun 10 19:44:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n'
b'Amazon Linux AMI release 2017.03\n'
END RequestId: dc4e13e8-733b-446c-b5a8-d4033baaef7c
REPORT RequestId: dc4e13e8-733b-446c-b5a8-d4033baaef7c  Duration: 79.33 ms      Billed Duration: 100 ms         Memory Size: 128 MB   Max Memory Used: 21 MB

毋庸置疑,Amazon Linux AMI 2017.03版本并没有改变,正如我们预期的那样。

大致上,根据博客文章,在2019/06/25之前新创建的函数将成为新的执行环境,当其进行更新时,旧的执行环境似乎会被取代。但是,Node.js和Python之间的更新定义似乎不同。我不太清楚具体细节。。。

总结吗?

从2019/06/25开始,应该会根据函数更新的时机应用新的执行环境,所以不会再出现像这次这样的行为。但是,将来切换到新的执行环境时可能会出现类似的行为…记住这一点可能会更好。

请参考

AWS Lambda和AWS Lambda@Edge执行环境的即将到来的更新。

近日,亚马逊计算服务博客发布了有关即将进行的AWS Lambda和AWS Lambda@Edge执行环境更新的最新时间安排。请参考以下链接了解详情:https://aws.amazon.com/jp/blogs/compute/updated-timeframe-for-the-upcoming-aws-lambda-and-aws-lambdaedge-execution-environment-update/

AWS Lambda 运行时 – AWS Lambda
https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html?icmpid=docs_lambda_rss

lambda — AWS CLI 1.16.182 命令参考
https://docs.aws.amazon.com/cli/latest/reference/lambda/index.html#cli-aws-lambda

AWS Lambda 层 – AWS Lambda
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html

bannerAds