本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將資源型政策用於 Lambda
Lambda 支援對 Lambda 函數和層使用資源型許可政策。資源型政策讓您能以每個資源為基礎,授予使用許可給其他 AWS 帳戶或組織。您也可使用以資源為基礎的政策來允許 AWS 服務代表您叫用您的函數。
針對 Lambda 函數,您可以授予帳戶叫用或管理函數的許可。您也可以使用單一資源型政策授予許可給在 AWS Organizations 中的整個組織。您也可以使用資源型政策來授予對 AWS 服務的叫用許可,該服務會叫用函數以回應您帳戶中的活動。
檢視函式以資源為基礎的政策
開啟 Lambda 主控台中的 函數頁面
。 -
選擇一個函數。
-
選擇 Configuration (組態),然後選擇 Permissions (權限)。
-
向下捲動至 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,您也可以將許可授予至組織中的所有帳戶。
注意
您只能在AddPermission和 AddLayerVersionPermissionAPI 動作範圍內更新 Lambda 資源以資源為基礎的政策。目前,您無法使用 JSON 為 Lambda 資源撰寫政策,或使用未映射至那些動作參數的條件。
以資源為基礎的政策適用於單一函式、版本、別名或 layer 版本。他們會將許可授予一或多個服務和帳戶。針對您想要多個資源之存取或使用以資源為基礎的政策不支援之 API 動作的信任帳戶,您可以使用跨帳戶角色。
支援的 API 動作
下列 Lambda 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 Resource Name (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-account123456789012
授予組織對函數的存取
若要授予許可給在 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: PrincipalOrg ID。
授予函式對其他帳戶的存取
若要將許可授予其他 AWS 帳戶,請將帳戶 ID 指定為 principal
。以下範例會授予帳戶 111122223333
以 prod
別名叫用 my-function
的許可。
aws lambda add-permission --function-name my-function:
prod
--statement-id xaccount --action lambda:InvokeFunction \ --principal111122223333
--output text
您應該會看到下列輸出:
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333: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
以下列範例會授予帳戶 111122223333 存取 bash-runtime
layer 第 2 版的許可。
aws lambda add-layer-version-permission --layer-name bash-runtime --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 2 --output text
您應該會看到類似下列的輸出:
e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}
許可僅適用於單一層版本。每次建立新的層版本時均需重複此程序。
若要將許可授予組織中的所有帳戶,請使用 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