Lambda 執行角色 - AWS Lambda

Lambda 執行角色

Lambda 函數的執行角色是 AWS Identity and Access Management (IAM) 角色,它可授予函數存取 AWS 服務和資源的許可。例如,您可以建立一個執行角色,該角色有權向 Amazon CloudWatch 傳送日誌並向 AWS X-Ray 上傳追蹤資料。本頁提供有關如何建立、檢視和管理 Lambda 函數執行角色的資訊。

當您建立函數時,可提供執行角色。當您調用函數時,Lambda 會透過擔任此角色自動為您的函數提供臨時憑證。您不必在函數程式碼中呼叫 sts:AssumeRole

為了讓 Lambda 能夠正確擔任執行角色,角色的信任政策必須將 Lambda 服務主體 (lambda.amazonaws.com) 指定為受信任的服務。

檢視函式的執行角色
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇函數的名稱。

  3. 選擇 組態 ,然後選擇 許可

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

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

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

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

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

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

若要在 IAM 主控台中建立執行角色
  1. 在 IAM 主控台中開啟 角色頁面

  2. 選擇 建立角色

  3. 使用案例 下,選擇 Lambda

  4. 選擇 下一步

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

  6. 選擇 下一步

  7. 輸入 角色名稱 ,然後選擇 建立角色

如需進一步說明,請參閱 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 – Lambda 已將 kafka:DescribeClusterV2 許可新增至此政策。

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

2022 年 6 月 17 日

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:SourceAccountaws:SourceArn 全域條件內容金鑰,以將角色的存取限制為僅由預期資源產生的請求。如需詳細資訊,請參閱 AWS Security Token Service 的預防跨服務混淆代理人

您可以透過以下服務來使用事件來源映射:

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

使用 Lambda 執行環境憑證

您的 Lambda 函數程式碼通常會向其他 AWS 服務發出 API 請求。若要提出這些請求,Lambda 會擔任函數的執行角色,以產生一組暫時性憑證。這些憑證在函數調用期間可當成環境變數使用。使用 AWS SDK 時,您不需要直接在程式碼中提供 SDK 的憑證。根據預設,憑證提供者鏈會依序檢查您可以設定憑證的每個位置,並選取第一個可用的位置,通常是環境變數 (AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_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: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 運算子。