Lambda 執行角色 - AWS Lambda

Lambda 執行角色

Lambda 函數的執行角色是 AWS Identity and Access Management (IAM) 角色,它可授予函數存取 AWS 服務和資源的許可。您會在建立函數時提供此角色,而 Lambda 會在函數被叫用時擔任此角色。你可以為開發建立一個執行角色,該角色有能向 Amazon CloudWatch 發送日誌和向 AWS X-Ray 上傳追蹤資料的許可。

檢視函式的執行角色

  1. 開啟 Lambda 主控台中的 Functions (函數) 頁面

  2. 選擇函數的名稱。

  3. 選擇 Configuration (組態),然後選擇 Permissions (許可)。

  4. Resource summary (資源摘要) 下,檢視該函數可存取的服務和資源。

  5. 從下拉式清單中選擇一種服務,以查看與該服務相關的許可。

您可以隨時從函式的執行角色新增或移除許可,或將函式設定為使用不同的角色。為您的函數使用 AWS 開發套件呼叫的任何服務和 Lambda 用來啟用選用功能的服務新增許可。

在將許可新增至您的函數時,亦請更新其程式碼或組態。若您函數的執行中執行個體具有已過期的憑證,上述動作會強制停止並取代這些執行個體。

在 IAM 主控台中建立執行角色

根據預設,當您在 Lambda 主控台中建立函數時,Lambda 會建立具有最低許可的執行角色。您也可以在 IAM 主控台中建立執行角色。

若要在 IAM 主控台中建立執行角色

  1. 開啟 IAM 主控台中的 Roles (角色) 頁面

  2. 選擇 Create Role (建立角色)。

  3. Use case (使用案例) 下,選擇 Lambda

  4. 選擇 Next (下一步)。

  5. 選擇受 AWS 管理的政策 AWSLambdaBasicExecutionRoleAWSXRayDaemonWriteAccess

  6. 選擇 Next (下一步)。

  7. 輸入 Role name (角色名稱),然後選擇 Create role (建立角色)。

如需進一步說明,請參閱 IAM 使用者指南中的為 AWS 服務 (主控台) 建立角色

為 Lambda 執行角色授予最低權限存取權

當您第一次為 Lambda 函數建立 IAM 角色時,有時可能會授予超出所需的許可。在生產環境中發佈您的函數之前,最佳實務是調整政策以僅包含必要的許可。如需詳細資訊,請參閱《IAM 使用者指南》中的套用最低權限許可

使用 IAM Access Analyzer 來協助識別 IAM 執行角色政策的必要許可。IAM Access Analyzer 會檢閱指定日期範圍的 AWS CloudTrail 記錄,並產生僅具有該函數在該時間內使用之許可的政策範本。您可以使用範本建立具有精細許可的受管政策,然後將其連接至 IAM 角色。如此一來,您只會授予角色與特定使用案例的 AWS 資源互動所需的許可。

如需詳細資訊,請參閱《IAM 使用者指南》中的根據存取活動產生政策

使用 IAM API 管理角色

如要使用 AWS Command Line Interface (AWS CLI) 建立執行角色,請使用 create-role 命令。

在下列範例中,您指定內嵌信任政策。JSON 字串中轉義引號的要求有所不同,這取決於您的 shell。

aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

您也可使用 JSON 檔案來定義角色的信任政策。在下列範例中,trust-policy.json 為當前目錄中的檔案。此信任政策會授予服務主體 lambda.amazonaws.com 呼叫 AWS Security Token Service (AWS STS) AssumeRole 動作的許可,以便 Lambda 能使用角色的許可。

範例 trust-policy.json

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
aws iam create-role --role-name lambda-ex --assume-role-policy-document file://trust-policy.json

您應該會看到下列輸出:

{ "Role": { "Path": "/", "RoleName": "lambda-ex", "RoleId": "AROAQFOXMPL6TZ6ITKWND", "Arn": "arn:aws:iam::123456789012:role/lambda-ex", "CreateDate": "2020-01-17T23:19:12Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }

使用 attach-policy-to-role 命令將許可新增至角色。透過新增 AWSLambdaBasicExecutionRole 受管政策開始。

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

臨時安全憑證的工作階段持續時間

Lambda 會假設與函數相關聯的執行角色來擷取臨時安全憑證,然後在函數叫用期間可作為環境變數使用。如果您在 Lambda 以外使用這些臨時憑證,例如建立預先簽署的 Amazon S3 URL,則您無法控制工作階段持續時間。IAM 工作階段持續時間上限設定不會套用至由 Lambda 這類 AWS 服務承擔的工作階段。如果您需要對工作階段持續時間的控制,請使用 sts:AssumeRole 動作。

Lambda 功能的 AWS 受管政策

下列 AWS 受管政策提供使用 Lambda 功能所需的許可。

變更 描述 日期

AWSLambdaBasicExecutionRole – Lambda 開始追蹤對此政策的變更。

AWSLambdaBasicExecutionRole 授予將日誌上傳至 CloudWatch 的許可。

2022 年 2 月 14 日

AWSLambdaDynamoDBExecutionRole – Lambda 開始追蹤對此政策的變更。

AWSLambdaDynamoDBExecutionRole 授予從 Amazon DynamoDB 串流讀取記錄和寫入 CloudWatch Logs 的許可。

2022 年 2 月 14 日

AWSLambdaKinesisExecutionRole – Lambda 開始追蹤對此政策的變更。

AWSLambdaKinesisExecutionRole 授予從 Amazon Kinesis 資料串流讀取事件和寫入 CloudWatch Logs 的許可。

2022 年 2 月 14 日

AWSLambdaMSKExecutionRole – Lambda 開始追蹤對此政策的變更。

AWSLambdaMSKExecutionRole 授予從 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 叢集中讀取和存取記錄、管理彈性網絡介面 (ENI),和寫入 CloudWatch Logs 的許可。

2022 年 2 月 14 日

AWSLambdaSQSQueueExecutionRole – Lambda 開始追蹤對此政策的變更。

AWSLambdaSQSQueueExecutionRole 授予從 Amazon Simple Queue Service (Amazon SQS) 佇列中讀取訊息並寫入 CloudWatch Logs 的許可。

2022 年 2 月 14 日

AWSLambdaVPCAccessExecutionRole – Lambda 開始追蹤對此政策的變更。

AWSLambdaVPCAccessExecutionRole 授予管理 Amazon VPC 內 ENI 和寫入 CloudWatch Logs 的許可。

2022 年 2 月 14 日

AWSXRayDaemonWriteAccess – Lambda 開始追蹤對此政策的變更。

AWSXRayDaemonWriteAccess 授予將追蹤資料上傳至 X-Ray 的許可。

2022 年 2 月 14 日

CloudWatchLambdaInsightsExecutionRolePolicy – Lambda 開始追蹤對此政策的變更。

CloudWatchLambdaInsightsExecutionRolePolicy 授予將執行時間指標寫入 CloudWatch Lambda Insights 的許可。

2022 年 2 月 14 日

AmazonS3ObjectLambdaExecutionRolePolicy – Lambda 開始追蹤對此政策的變更。

AmazonS3ObjectLambdaExecutionRolePolicy 會授予許可,以與 Amazon Simple Storage Service (Amazon S3) 物件 Lambda 互動,並寫入 CloudWatch Logs。

2022 年 2 月 14 日

針對某些功能,Lambda 主控台會嘗試將遺漏的許可新增到您客戶受管政策中的執行角色。這些政策的數量可能會相當多。請在啟用功能前將相關受 AWS 管理˙政策新增到您的執行角色,以避免建立額外政策。

當您使用事件來源映射來叫用函數時,Lambda 會使用執行角色來讀取事件資料。例如,Kinesis 的事件來源映射會從資料串流讀取事件,並將這些事件批次傳送到函數。您可以透過以下服務來使用事件來源映射:

除了受 AWS 管理的政策,Lambda 主控台會提供範本,您可用來建立擁有與其他使用案例許可相關的自訂政策。當您在 Lambda 主控台中建立函數時,您可以選擇使用來自一個或多個範本的許可建立新的執行角色。當您從藍圖建立函式時,或是您設定需要存取其他服務的選項時,也會自動套用這些範本。範例範本可在此指南的 GitHub 儲存庫取得。

使用 Lambda 執行環境憑證

您的 Lambda 函數程式碼通常會向其他 AWS 服務發出 API 請求。若要提出這些請求,Lambda 會擔任函數的執行角色,以產生一組暫時性憑證。Lambda 也會自動將來源函數 Amazon Resource Name (ARN) 插入憑證內容,該內容是用來從函數程式碼發出 API 請求。

Lambda 僅會在請求為來自您執行環境的 AWS API 請求時,才會將來源函數 ARN 插入憑證內容中。AWSLambda 使用相同執行角色代表您在執行環境外進行的 API 呼叫不會包含來源函數 ARN。這類執行環境外的 API 呼叫範例包括:

  • 呼叫 AWS Key Management Service (AWS KMS),以自動加密和解密您的環境變數。

  • 呼叫 CloudWatch,以進行記錄。

您可以使用憑證內容中的來源函數 ARN,驗證對資源的呼叫是否來自特定 Lambda 函數的程式碼。若要驗證這一點,請在 IAM 身分型政策或服務控制政策 (SCP) 中使用 lambda:SourceFunctionArn 條件索引鍵。

注意

您無法在資源型政策中使用 lambda:SourceFunctionArn 條件索引鍵。

在您的身分型政策或 SCP 中使用此條件索引鍵,您可以為函數程式碼對其他 AWS 服務進行的 API 操作,執行安全控制。此操作具有一些關鍵的安全保護作用,例如,協助您識別憑證洩漏的來源。

注意

lambda:SourceFunctionArn 條件索引鍵與 lambda:FunctionArnaws:SourceArn 條件索引鍵不同。lambda:FunctionArn 條件索引鍵僅適用於事件來源映射,會協助定義您的事件來源可以呼叫哪些函數。aws:SourceArn 條件索引鍵僅適用於 Lambda 函數為目標資源的政策,並協助定義哪些其他 AWS 服務和資源可以調用該函數。lambda:SourceFunctionArn 條件索引鍵可套用至任何身分型政策或 SCP,以定義具有許可能夠對其他資源進行特定 AWS API 呼叫的特定 Lambda 函數。

若要在政策中使用 lambda:SourceFunctionArn,請將其作為任何 ARN 條件運算子的條件,納入到政策中。索引鍵的值必須為有效的 ARN。

例如,假設您的 Lambda 函數程式碼會進行 s3:PutObject 呼叫,該呼叫以特定 Amazon S3 儲存貯體為目標。您可能希望僅允許一個特定 Lambda 函數擁有對該儲存貯體的 s3:PutObject 存取權。在此情況下,您函數的執行角色應連接有類似以下的政策:

範例 授予特定 Lambda 函數存取權以存取 Amazon S3 資源的政策

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleSourceFunctionArn", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::lambda_bucket/*", "Condition": { "ArnEquals": { "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda" } } } ] }

此政策僅在來源為具有 ARN arn:aws:lambda:us-east-1:123456789012:function:source_lambda 的 Lambda 函數時允許 s3:PutObject 存取權。此政策不允許對任何其他呼叫身分的 s3:PutObject 存取權。即使不同函數或實體以相同執行角色進行 s3:PutObject 呼叫也是如此。

您也可以在《服務控制原則》中使用 lambda:SourceFunctionArn。例如,假設您要僅讓單一 Lambda 函數的程式碼或來自 Amazon 虛擬私有雲端 (VPC) 的呼叫能存取儲存貯體。以下 SCP 對此進行說明。

範例 在特定條件下拒絕對 Amazon S3 的存取的政策

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:*" ], "Resource": "arn:aws:s3:::lambda_bucket/*", "Effect": "Deny", "Condition": { "StringNotEqualsIfExists": { "aws:SourceVpc": [ "vpc-12345678" ] }, "ArnNotEqualsIfExists": { "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda" } } } ] }

除非 S3 動作來自具有 ARN arn:aws:lambda:*:123456789012:function:source_lambda 的特定 Lambda 函數,或是其來自指定的 VPC,否則此政策會拒絕所有 S3 動作。僅在請求中包含 aws:SourceVpc 索引鍵時,StringNotEqualsIfExists 運算子才會告訴 IAM 處理此條件。同樣地,僅在 lambda:SourceFunctionArn 存在時,IAM 才會考慮 ArnNotEqualsIfExists 運算子。