View a markdown version of this page

在 Lambda 中使用資源型政策 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Lambda 中使用資源型政策

透過以資源為基礎的許可政策,您可以授予其他 AWS 帳戶使用者、組織和 Lambda 函數的 AWS 服務 存取權。資源型政策是包含一或多個陳述式的 JSON 文件。每個陳述式定義下列項目:

  • Principal:您想要授予許可的實體 (另一個 AWS 服務、IAM 角色或使用者,或其他 AWS 帳戶)

  • Action:您要允許或拒絕指定委託人的 API 動作清單

  • Effect:您是否要允許或拒絕委託人使用所選 API 動作的能力

  • Resource:您要套用陳述式的 Lambda 函數、版本或別名 (您也可以使用萬用字元來指定函數的所有版本和別名)

您也可以使用選用的元素,例如 Sid(陳述式識別符) 和 Condition(精細存取控制的邏輯條件)。如需支援政策元素的完整清單,請參閱《 AWS Identity and Access Management 使用者指南》中的 IAM JSON 政策元素參考。

將資源型許可新增至 Lambda 函數

您可以使用兩種方法,將資源型許可新增至 Lambda 函數:

  • 完整 JSON 政策 – 使用 Lambda 主控台 AWS CLI或 PutResourcePolicy API 動作來新增完整的 JSON 政策文件。透過完整的 JSON 政策,您可以使用完整的 IAM 全域條件金鑰範圍、新增具有多個主體的多個陳述式,以及建立明確的Deny陳述式。JSON 資源型政策的大小上限為 20 KB。

  • 個別許可 – 使用主控台或 AddPermission API 動作來新增單一Allow陳述式。個別許可僅支援一組有限的條件金鑰 (aws:SourceArn、 aws:SourceAccount和 aws:PrincipalOrgID)。

建議您定義完整的 JSON 政策,將資源型許可新增至函數。建立完整的 JSON 政策可讓您更靈活地控制許可。

重要

使用 會put-resource-policy取代資源上任何現有的資源型政策。如果資源已具有以 定義的許可add-permission, 會put-resource-policy覆寫它們。get-resource-policy 使用 在進行變更之前擷取現有的政策。

所需的許可

若要使用 PutResourcePolicy、 GetResourcePolicy和 DeleteResourcePolicy API 動作,您需要下列 IAM 許可:

API 動作 所需的許可
PutResourcePolicy lambda:PutResourcePolicy、lambda:AddPermission 與 lambda:RemovePermission
GetResourcePolicy lambda:GetResourcePolicy 和 lambda:GetPolicy
DeleteResourcePolicy lambda:DeleteResourcePolicy 和 lambda:RemovePermission
Console
建立完整的 JSON 資源型政策
  1. 開啟 Lambda 主控台中的函數頁面。

  2. 選取您要授予存取權的函數,然後選取組態索引標籤。

  3. 選取許可。

  4. 在資源型政策陳述式窗格中,選擇編輯。此動作會開啟 JSON 政策編輯器。

  5. 將陳述式新增至函數的政策。您可以選取 API 動作、新增不同類型的主體 (服務、帳戶、IAM 角色),以及新增條件金鑰來控制存取。

  6. 選擇儲存。

您也可以直接在政策窗格中編輯函數的資源型政策。

AWS CLI
新增完整的 JSON 資源型政策

若要將完整的 JSON 政策新增至函數,請使用 put-resource-policy AWS CLI 命令。

下列範例命令會使用本機電腦上名為 的檔案中定義的政策,將資源型政策新增至policy.json您的 函數。從包含 檔案的目錄執行 命令。resource-arn 可以指定函數版本或別名,或者您可以使用不合格的函數 ARN 將政策套用至整個函數。

aws lambda put-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function \ --policy file://policy.json
Lambda APIs

若要將完整的 JSON 許可政策新增至函數,請使用 PutResourcePolicy API 動作。您也可以使用 DeleteResourcePolicy 動作刪除函數的政策,或使用 GetResourcePolicy 動作擷取目前連接至函數的政策。

若要將個別許可新增至函數的政策,請使用 AddPermission API 動作。

檢視函數的資源型政策

Console
檢視函式以資源為基礎的政策
  1. 開啟 Lambda 主控台中的 函數頁面。

  2. 選擇一個函數。

  3. 選擇 Configuration (組態),然後選擇 Permissions (權限)。

  4. 向下捲動至以資源為基礎的政策陳述式以查看政策。

AWS CLI

若要檢查函式的以資源為基礎的政策,請使用 get-resource-policy 命令。您可以使用函數的不合格 ARN,或指定版本或別名。

aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

您也可以使用 get-policy命令:

aws lambda get-policy \ --function-name my-function \ --output text
Lambda APIs

若要擷取函數的資源型政策,請使用 GetResourcePolicy API 動作。您可以使用函數的不合格 ARN,或指定版本或別名 ARN。

您也可以使用 GetPolicy API 動作。

刪除函數的資源型政策

Console
刪除函數的資源型政策
  1. 開啟 Lambda 主控台中的函數頁面。

  2. 選取您要刪除許可政策的函數。

  3. 選取組態索引標籤,然後選取許可。

  4. 在資源型政策陳述式窗格中,選擇刪除。

AWS CLI

若要刪除函數的政策,請使用 delete-resource-policy命令,並指定您要刪除政策的函數、版本或別名的 ARN。

aws lambda delete-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

若要移除個別陳述式,請使用 remove-permission。

aws lambda remove-permission \ --function-name example \ --statement-id sns
Lambda APIs

若要刪除連接至函數、函數版本或函數別名的資源型政策,請使用 DeleteResourcePolicy API 動作。

若要從政策中移除個別陳述式,請使用 RemovePermission API 動作。

更新現有政策

當您更新函數的現有資源型許可時,行為取決於您使用的方法:

  • put-resource-policy / PutResourcePolicy – 取代整個現有政策。任何先前新增的個別許可都會遭到覆寫。

  • add-permission / AddPermission – 在不覆寫的情況下將陳述式新增至現有政策。如果您在 add-permission之後呼叫 put-resource-policy,新陳述式會附加到現有的 JSON 政策。

若要避免在使用 時意外覆寫現有的許可put-resource-policy,請先擷取函數的現有政策。get-resource-policy 輸出包含 RevisionId 欄位。

aws lambda get-resource-policy --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function

當您連接新政策時,請提供 參數RevisionId的值,--revision-id以確保您更新的是最新版本。如果您提供較舊的修訂 ID,Lambda 不會更新函數的政策。

aws lambda put-resource-policy \ --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function \ --policy file://policy.json \ --revision-id a1b2c3d4-5678-90ab-cdef-EXAMPLE11111
注意

使用 建立的現有資源型政策會AddPermission繼續運作,無需修改。使用新的 PutResourcePolicy API 不需要變更函數程式碼。

安全最佳實務

使用 JSON 資源型政策,您可以遵循最低權限的存取模式。您也可以符合明確拒絕的法規要求。使用完整的 JSON 政策,您可以:

  • 建立明確Deny陳述式以封鎖特定主體或條件。

  • 使用組織條件 (aws:PrincipalOrgID、aws:PrincipalOrgPaths) 來限制對 Organizations 的存取,而無需列舉個別帳戶。

  • 使用完整的 IAM 全域條件金鑰範圍特定來源帳戶或 ARNs 的許可。

以資源為基礎的政策範例

範例使用拒絕陳述式將許可授予 Amazon S3

下列政策會授予帳戶中的所有 Amazon S3 儲存貯體呼叫 函數的許可,明確拒絕的儲存貯體除外。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-s3", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "StringEquals": { "aws:SourceAccount": "111122223333" } } }, { "Sid": "deny-s3-bucket", "Effect": "Deny", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-2:111122223333:function:my-function", "arn:aws:lambda:us-east-2:111122223333:function:my-function:*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-bucket" } } } ] }
範例將許可授予組織中的帳戶

下列政策會授予 叫用 組織中所有 AWS 帳戶 的存取權。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "org-access", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } } } ] }
範例將許可授予具有條件的多個 IAM 角色

下列政策授予兩個 IAM 角色使用指定 IP 地址中 CreateAlias 動作的許可。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-roles", "Effect": "Allow", "Action": "lambda:CreateAlias", "Principal": { "AWS": [ "arn:aws:iam::444455556666:role/role-name", "arn:aws:iam::444455556666:role/role-name2" ] }, "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "IpAddress": { "aws:SourceIp": "192.0.2.0" } } } ] }
範例除非發起人是指定組織的一部分,否則拒絕存取
{ "Version": "2012-10-17", "Statement": [ { "Sid": "deny-access", "Effect": "Deny", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" ] } } }, { "Sid": "allow-access", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Principal": "*", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:my-function", "Condition": { "ForAnyValue:StringLike": { "aws:PrincipalOrgPaths": [ "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/*" ] } } } ] }

支援的 API 動作

下列 Lambda API 動作支援資源型政策: