Lambda 執行角色
Lambda 函數的執行角色是 AWS Identity and Access Management (IAM) 角色,它可授予函數存取 AWS 服務和資源的許可。例如,您可以建立一個執行角色,該角色有權向 Amazon CloudWatch 傳送日誌並向 AWS X-Ray 上傳追蹤資料。本頁提供有關如何建立、檢視和管理 Lambda 函數執行角色的資訊。
當您建立函數時,可提供執行角色。當您調用函數時,Lambda 會透過擔任此角色自動為您的函數提供臨時憑證。您不必在函數程式碼中呼叫 sts:AssumeRole
。
為了讓 Lambda 能夠正確擔任執行角色,角色的信任政策必須將 Lambda 服務主體 (lambda.amazonaws.com
) 指定為受信任的服務。
檢視函式的執行角色
開啟 Lambda 主控台中的 函數頁面
。 -
選擇函數的名稱。
-
選擇 組態 ,然後選擇 許可 。
-
在 資源摘要 下,檢視該函數可存取的服務和資源。
-
從下拉式清單中選擇一種服務,以查看與該服務相關的許可。
您可以隨時從函式的執行角色新增或移除許可,或將函式設定為使用不同的角色。為您的函數使用 AWS 開發套件呼叫的任何服務和 Lambda 用來啟用選用功能的服務新增許可。
在將許可新增至您的函數時,亦請更新其程式碼或組態。若您函數的執行中執行個體具有已過期的憑證,上述動作會強制停止並取代這些執行個體。
主題
在 IAM 主控台中建立執行角色
根據預設,當您在 Lambda 主控台中建立函數時,Lambda 會建立具有最低許可的執行角色。您也可以在 IAM 主控台中建立執行角色。
若要在 IAM 主控台中建立執行角色
-
在 IAM 主控台中開啟 角色頁面
。 -
選擇 建立角色。
-
在 使用案例 下,選擇 Lambda。
-
選擇 下一步。
-
選擇受 AWS 管理的政策 AWSLambdaBasicExecutionRole 和 AWSXRayDaemonWriteAccess。
-
選擇 下一步。
-
輸入 角色名稱 ,然後選擇 建立角色 。
如需進一步說明,請參閱 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 命令。使用此命令時,您可以指定內嵌信任政策。角色的信任政策授予指定主體擔任該角色的許可。在下列範例中,您授予 Lambda 服務主體擔任您的角色的許可。注意,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
為當前目錄中的檔案。
範例 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" } ] } } }
注意
當您調用函數時,Lambda 會自動擔任您的執行角色。您應該避免在函數程式碼中手動呼叫 sts:AssumeRole
。如果您的使用案例請求角色擔任自己,則您必須將角色本身作為受信任主體包含在角色的信任政策中。如需如何修改角色信任政策的詳細資訊,請參閱《IAM 使用者指南》中的修改角色信任政策 (主控台)。
使用 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 功能所需的許可。
變更 | 描述 | 日期 |
---|---|---|
AWSLambdaMSKExecutionRole |
|
2022 年 6 月 17 日 |
AWSLambdaBasicExecutionRole |
|
2022 年 2 月 14 日 |
AWSLambdaDynamoDBExecutionRole |
|
2022 年 2 月 14 日 |
AWSLambdaKinesisExecutionRole |
|
2022 年 2 月 14 日 |
AWSLambdaMSKExecutionRole |
|
2022 年 2 月 14 日 |
AWSLambdaSQSQueueExecutionRole |
|
2022 年 2 月 14 日 |
AWSLambdaVPCAccessExecutionRole |
|
2022 年 2 月 14 日 |
AWSXRayDaemonWriteAccess |
|
2022 年 2 月 14 日 |
CloudWatchLambdaInsightsExecutionRolePolicy |
|
2022 年 2 月 14 日 |
AmazonS3ObjectLambdaExecutionRolePolicy |
|
2022 年 2 月 14 日 |
針對某些功能,Lambda 主控台會嘗試將遺漏的許可新增到您客戶受管政策中的執行角色。這些政策的數量可能會相當多。請在啟用功能前將相關受 AWS 管理˙政策新增到您的執行角色,以避免建立額外政策。
當您使用事件來源映射來調用函數時,Lambda 會使用執行角色來讀取事件資料。例如,Kinesis 的事件來源映射會從資料串流讀取事件,並將這些事件批次傳送到函數。
當服務在您的帳戶中擔任角色時,您可以在角色信任政策中包含 aws:SourceAccount
和 aws:SourceArn
全域條件內容金鑰,以將角色的存取限制為僅由預期資源產生的請求。如需詳細資訊,請參閱 AWS Security Token Service 的預防跨服務混淆代理人。
您可以透過以下服務來使用事件來源映射:
Lambda 從中讀取事件的服務
除了受 AWS 管理的政策,Lambda 主控台會提供範本,您可用來建立擁有與其他使用案例許可相關的自訂政策。當您在 Lambda 主控台中建立函數時,您可以選擇使用來自一個或多個範本的許可建立新的執行角色。當您從藍圖建立函式時,或是您設定需要存取其他服務的選項時,也會自動套用這些範本。範例範本可在此指南的 GitHub 儲存庫
使用 Lambda 執行環境憑證
您的 Lambda 函數程式碼通常會向其他 AWS 服務發出 API 請求。若要提出這些請求,Lambda 會擔任函數的執行角色,以產生一組暫時性憑證。這些憑證在函數調用期間可當成環境變數使用。使用 AWS SDK 時,您不需要直接在程式碼中提供 SDK 的憑證。根據預設,憑證提供者鏈會依序檢查您可以設定憑證的每個位置,並選取第一個可用的位置,通常是環境變數 (AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_SESSION_TOKEN
)。
Lambda 僅會在請求為來自您執行環境的 AWS API 請求時,才會將來源函數 ARN 插入憑證內容中。針對 Lambda 代表您在執行環境外發出的下列 AWS API 請求,Lambda 也會插入來源函數 ARN:
服務 | 動作 | 原因 |
---|---|---|
CloudWatch Logs | CreateLogGroup , CreateLogStream , PutLogEvents |
將日誌儲存到 CloudWatch Logs 日誌群組中 |
X-Ray | PutTraceSegments |
將追蹤資料傳送到 X-Ray |
Amazon EFS | ClientMount |
將函數連接到 Amazon Elastic File System (Amazon EFS) 檔案系統 |
Lambda 使用相同執行角色代表您在執行環境外進行的其他 AWS API 呼叫,不會包含來源函數 ARN。這類執行環境外的 API 呼叫範例包括:
-
呼叫 AWS Key Management Service (AWS KMS),以自動加密和解密您的環境變數。
-
對 Amazon Elastic Compute Cloud (Amazon EC2) 發出的呼叫,目的是為已啟用 VPC 的函數建立彈性網絡介面 (ENI)。
-
對 AWS 服務 (例如 Amazon Simple Queue Service (Amazon SQS)) 發出的呼叫,目的是讀取設定為事件來源映射的事件來源。
您可以使用憑證內容中的來源函數 ARN,驗證對資源的呼叫是否來自特定 Lambda 函數的程式碼。若要驗證這一點,請在 IAM 身分型政策或服務控制政策 (SCP) 中使用 lambda:SourceFunctionArn
條件索引鍵。
注意
您無法在資源型政策中使用 lambda:SourceFunctionArn
條件索引鍵。
在您的身分型政策或 SCP 中使用此條件索引鍵,您可以為函數程式碼對其他 AWS 服務進行的 API 操作,執行安全控制。此操作具有一些關鍵的安全保護作用,例如,協助您識別憑證洩漏的來源。
注意
lambda:SourceFunctionArn
條件索引鍵與 lambda:FunctionArn
和 aws: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
運算子。