對 AWS Lambda​ 使用以資源為基礎的政策 - AWS Lambda

對 AWS Lambda​ 使用以資源為基礎的政策

AWS Lambda 支援適用於 Lambda 函數和層的以資源為基礎的許可政策。資源型政策讓您能以每個資源為基礎,授予使用許可給其他 AWS 帳戶或組織。您也可使用以資源為基礎的政策來允許 AWS 服務代表您叫用您的函數。

針對 Lambda 函數,您可以授予帳戶叫用或管理函數的許可。您也可以使用單一資源型政策授予許可給在 AWS Organizations 中的整個組織。您也可以使用資源型政策來授予對 AWS 服務的叫用許可,該服務會叫用函數以回應您帳戶中的活動。

檢視函式以資源為基礎的政策

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

  2. 選擇一個函數。

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

  4. 向下捲動至 Resource-based policy (資源型政策),然後選擇 View policy document (檢視政策文件)。以資源為基礎的政策會顯示其他帳戶或 AWS 服務嘗試存取函式時套用的許可。下列範例顯示的陳述式允許 Amazon S3 針對帳戶 123456789012 中名稱為 my-bucket 的儲存貯體,叫用名為 my-function 的函數。

    範例 以資源為基礎政策

    { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "lambda-allow-s3-my-function", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" }, "ArnLike": { "AWS:SourceArn": "arn:aws:s3:::my-bucket" } } } ] }

對於 Lambda 層級,您只能在特定層級版本上使用以資源為基礎的政策,而不是在整個層級上使用。除了會將許可授予至單一帳戶或多個帳戶的政策,針對 layer,您也可以將許可授予至組織中的所有帳戶。

注意

您只能針對 AddPermissionAddLayerVersionPermission API 動作範圍內的 Lambda 資源,更新以資源為基礎的政策。目前,您無法使用 JSON 為 Lambda 資源撰寫政策,或使用未映射至那些動作參數的條件。

以資源為基礎的政策適用於單一函式、版本、別名或 layer 版本。他們會將許可授予一或多個服務和帳戶。針對您想要多個資源之存取或使用以資源為基礎的政策不支援之 API 動作的信任帳戶,您可以使用跨帳戶角色

​授予函式對 AWS 服務的存取

當您使用 AWS 服務來叫用函式時,您會在以資源為基礎之政策的陳述式中授予許可。您可以將陳述式套用至要叫用或管理的整個函數,或將陳述式限制在單一版本或別名。

注意

當您透過Lambda 主控台將觸發新增至函數時,主控台會更新函數的以資源為基礎的政策來允許服務進行叫用。若要將許可授予無法在 Lambda 主控台中使用的其他帳戶或服務,您可使用 AWS CLI。

使用 add-permission 命令新增陳述式。最簡單的以資源為基礎的政策陳述式可讓服務叫用函式。下列命令可授予 Amazon SNS 叫用名為 my-function 之函數的許可。

aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns \ --principal sns.amazonaws.com --output text

您應該會看到下列輸出:

{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

這可讓 Amazon SNS 叫用函數的 lambda:Invoke API,但不會限制會觸發叫用的 Amazon SNS 主題。若要確保您的函式只會被特定的資源叫用,請使用 source-arn 選項來指定資源的 Amazon 資源名稱 (ARN) 。下列命令僅允許 Amazon SNS 為名為 my-topic 的主題訂閱叫用函數。

aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns-my-topic \ --principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-2:123456789012:my-topic

有些服務可在不同的帳戶中叫用函式。如果您指定的來源 ARN 中有帳戶 ID,您可以放心。然而,對於 Amazon S3,來源是一種儲存貯體,其 ARN 沒有帳戶 ID。您可以刪除該儲存貯體,且其他帳戶可使用相同的名稱建立儲存貯體。透過您的帳戶 ID 使用 source-account 選項來確保只有帳戶中的資源可叫用該函式。

aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id s3-account \ --principal s3.amazonaws.com --source-arn arn:aws:s3:::my-bucket-123456 --source-account 123456789012

授予組織對函數的存取

若要授予許可給在 AWS Organizations 中的組織,指定組織 ID 為 principal-org-id。下列 AddPermission AWS CLI 命令將叫用存取權授予組織 o-a1b2c3d4e5f 中的所有使用者。

aws lambda add-permission --function-name example \ --statement-id PrincipalOrgIDExample --action lambda:InvokeFunction \ --principal * --principal-org-id o-a1b2c3d4e5f
注意

在此命令中,Principal*。這意味着組織 o-a1b2c3d4e5f 中的所有使用者都會取得函數叫用許可。如果將 AWS 帳戶或角色指定為 Principal,則只有該主體才能取得函數叫用許可,但前提是其亦屬於 o-a1b2c3d4e5f 組織的一部分。

此命令建立類似以下的資源型政策:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PrincipalOrgIDExample", "Effect": "Allow", "Principal": "*", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-west-2:123456789012:function:example", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } } } ] }

如需詳細資訊,請參閱《AWS Identity and Access Management 使用者指南》中的 aws:PrincipalOrgID

授予函式對其他帳戶的存取

若要將許可授予其他 AWS 帳戶,請將帳戶 ID 指定為 principal。以下範例會授予帳戶 210987654321my-function 別名叫用 prod 的許可。

aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 210987654321 --output text

您應該會看到下列輸出:

{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

以資源為基礎的政策會授予其他帳戶存取函數的許可,但不允許該帳戶中的使用者超過其許可。另一個帳戶中的使用者必須具有相對應的使用者許可才能使用 Lambda API。

若要限制另一個帳戶中使用者或角色的存取,請指定身分的完整 ARN 作為主體。例如: 。arn:aws:iam::123456789012:user/developer

別名會限制其他帳戶可叫用的版本。這需要其他帳戶在函式 ARN 中包含別名。

aws lambda invoke --function-name arn:aws:lambda:us-west-2:123456789012:function:my-function:prod out

您應該會看到下列輸出:

{ "StatusCode": 200, "ExecutedVersion": "1" }

然後,函數擁有者可以更新別名以指向新版本,而無需呼叫者變更他們叫用函數的方式。這可確保另一個帳戶不需要變更其程式碼來使用新版本,而且它只具有叫用與別名關聯之函數版本的許可。

您可以為在現有函式上操作之大部分 API 動作授予跨帳戶存取。例如,您可以授予對 lambda:ListAliases 的存取,來讓帳戶取得別名的清單,或 lambda:GetFunction 讓他們下載函式程式碼。個別新增每個許可,或使用 lambda:* 來授予對指定函式進行所有動作的存取。

若要授予其他帳戶多個動作或是不在函數上操作之動作的許可,我們建議您請使用 IAM 角色

授予 Layer 對其他帳戶的存取

如欲將層使用許可授予其他帳戶,請透過 add-layer-version-permission 命令將陳述式新增至層版本的許可政策。在各陳述式中,您可將許可授予單一帳戶、所有帳戶或某個組織。

aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text

您應該會看到類似下列的輸出:

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

許可僅適用於單一層版本。每次建立新的層版本時均需重複此程序。

若要將許可授予組織中的所有帳戶,請使用 organization-id 選項。以下範例授予組織內的所有帳戶使用第 3 版 Layer 的許可。

aws lambda add-layer-version-permission --layer-name my-layer \ --statement-id engineering-org --version-number 3 --principal '*' \ --action lambda:GetLayerVersion --organization-id o-t194hfs8cz --output text

您應該會看到下列輸出:

b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"

若要將許可授予所有 AWS 帳戶,請使用 * 表示委託人並省略組織 ID。如有多個帳戶或組織,您需要加入多個陳述式。

清理以資源為基礎的政策

若要檢查函式的以資源為基礎的政策,請使用 get-policy 命令。

aws lambda get-policy --function-name my-function --output text

您應該會看到下列輸出:

{"Version":"2012-10-17","Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function","Condition":{"ArnLike":{"AWS:SourceArn":"arn:aws:sns:us-east-2:123456789012:lambda*"}}}]} 7c681fc9-b791-4e91-acdf-eb847fdaa0f0

針對版本和別名,在函式名稱的後方附加版本編號或別名。

aws lambda get-policy --function-name my-function:PROD

若要將許可從函式中移除,請使用 remove-permission

aws lambda remove-permission --function-name example --statement-id sns

使用 get-layer-version-policy 指令檢視層級上的權限。

aws lambda get-layer-version-policy --layer-name my-layer --version-number 3 --output text

您應該會看到下列輸出:

b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"

使用 remove-layer-version-permission 以從策略中移除陳述式。

aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org