如何提供 Lambda 函數的精細存取權?

5 分的閱讀內容
0

我想授予特定 AWS Lambda 函數的讀取和寫入存取權,該函數由其 Amazon Resource Name (ARN) 識別。如何提供 Lambda 函數的精細存取權?

簡短說明

您可以使用 AWS Identity and Access Management (IAM) 政策為 Lambda 函數設定權限,以執行以下作業:

  • 建立 Lambda 函數
  • 刪除 Lambda 函數
  • 檢視 Lambda 函數組態的詳細資訊
  • 修改 Lambda 函數
  • 調用 Lambda 函數
  • 監控 Lambda 函數

在下列政策範例中,支援資源層級權限的 Lambda API 動作僅限於每個陳述式資源元素中列出的特定 Lambda 函數。若 API 動作支援這些元素,則會在條件元素中使用特定函數名稱。

不支援資源層級權限的 API 動作需要在資源元素中使用萬用字元 (「**\ * **」),且無法套用任何 Lambda 服務的特定條件金鑰。如需 Lambda 支援的 IAM 動作、資源和條件的詳細資訊,請參閱 AWS Lambda 的動作、資源和條件金鑰

陳述式資源元素的值會使用 ARN 來識別陳述式適用的資源。例如,當動作調用時,資源為函數 ARN。IAM 將此 ARN 與「「調用」請求 FunctionNameQualifier 參數所識別的函數的 ARN 進行匹配。如需詳細資訊,請參閱 AWS Lambda 函數版本

**注意:**如果您使用多個版本和別名,則可能需要在資源元素中包含「arn:aws:lambda:region:AccountID:function:function_name:*」。

解決方案

建立 Lambda 函數所需的權限

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確定您使用的是最新的 AWS CLI 版本

若要使用 AWS Command Line Interface (AWS CLI) 或 SDK 建立 Lambda 函數,必須擁有lambda:CreateFunctioniam:PassRole權限。如需政策範例,請參閱適用於 AWS Lambda 的 Identity-based IAM 政策。下列政策允許 API 呼叫者建立 Lambda 函數、將 IAM 角色傳遞為函數的 Lambda 執行角色,然後從本機電腦上傳程式碼:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionToCreateFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    },
    {
      "Sid": "PermissionToPassARole",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::AccountID:role/role_name"
    }
  ]
}

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

如果您從 Amazon Simple Storage Service (Amazon S3) 儲存貯體上傳程式碼 ,請將類似下列內容的政策新增到現有 IAM 政策,以授予 Amazon S3 所需的權限:

...
{
  "Sid": "PermissionToUploadCodeFromS3",
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::S3BucketName/FileName.zip"
}
...

**注意:**更新政策以包含相關的 S3 儲存貯體和檔案名稱。

由於在 Lambda 主控台中建立函數時無法提供程式碼,因此需要 API 權限,例如讀取層級 API 動作與檢視和更新函數的權限。新增類似下列內容的政策以授予這些權限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionsToViewFunctionsInConsole",
      "Effect": "Allow",
      "Action": [
        "lambda:ListFunctions",
        "lambda:GetAccountSettings"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionsToCreateAndUpdateFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:GetFunction",
        "lambda:UpdateFunctionCode"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    },
    {
      "Sid": "PermissionToListExistingRoles",
      "Effect": "Allow",
      "Action": [
        "iam:ListRoles"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionToPassARole",
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::AccountID:role/role_name"
    }
  ]
}

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

若要在 Lambda 函數建立程序期間建立 IAM 角色,請新增類似下列內容的其他 IAM 權限:

...
{
  "Sid": "PermmissionsToCreateAndUpdateARole",
  "Effect": "Allow",
  "Action": [
    "iam:CreateRole",
    "iam:CreatePolicy",
    "iam:PutRolePolicy",
    "iam:AttachRolePolicy"
  ],
  "Resource": "*"
}
...

刪除 Lambda 函數所需的權限

若要使用 AWS CLI 或 SDK 刪除 Lambda 函數,請新增類似下列內容的權限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionToDeleteFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:DeleteFunction"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    }
  ]
}

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

若要使用 Lambda 主控台刪除 Lambda 函數,請新增類似下列內容的 Lambda 讀取存取權限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionsToViewFunctionsInConsole",
      "Effect": "Allow",
      "Action": [
        "lambda:ListFunctions",
        "lambda:GetAccountSettings"
      ],
      "Resource": "*"
    },
    {
      "Sid": "PermissionToDeleteFunction",
      "Effect": "Allow",
      "Action": [
        "lambda:DeleteFunction"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    }
  ]
}

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

檢視 Lambda 函數的組態詳細資訊所需的權限

若要授予使用者檢視 Lambda 函數組態詳細資訊的權限,請新增類似下列內容的權限:

**注意:**視您要授予的讀取存取權限層級而定,在使用 AWS CLI 或 SDK 時,您可能需要授予下列全部或部分權限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ActionsWhichSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:GetFunction",
        "lambda:GetFunctionConfiguration",
        "lambda:GetPolicy",
        "lambda:GetAlias",
        "lambda:ListVersionsByFunction",
        "lambda:ListAliases"
      ],
      "Resource": [
        "arn:aws:lambda:region:AccountID:function:function_name"
      ]
    },
    {
      "Sid": "ActionsWhichDoNotSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:ListTags",
        "lambda:GetEventSourceMapping",
        "lambda:ListEventSourceMappings"
      ],
      "Resource": "*"
    }
  ]
}

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

若要使用 Lambda 主控台檢視函數的組態詳細資訊,請新增類似下列內容的權限:

...
{
  "Sid": "PermissionsToViewFunctionsInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings"
  ],
  "Resource": "*"
}
...

Lambda 主控台使用標記 Lambda 函數,可讓您依標籤篩選 Lambda 函數。若要使用 AWS 標記服務,請新增類似下列內容的權限:

...
{
  "Sid": "PermissionsToFilterFunctionsByTags",
  "Effect": "Allow",
  "Action": [
     "tag:GetResources"
  ],
  "Resource": "*"
}
...

Lambda 主控台會顯示與 Lambda 函數相關聯的 IAM 角色,以及該函數 IAM 角色可存取資源的詳細資訊。若要檢視這些詳細資訊,請新增類似下列內容的權限:

...
{
  "Sid": "PermissionsToViewRolesAndPolicies",
  "Effect": "Allow",
  "Action": [
    "iam:GetPolicy",
    "iam:GetPolicyVersion",
    "iam:GetRolePolicy",
    "iam:ListRoles",
    "iam:ListRolePolicies",
    "iam:ListAttachedRolePolicies"
  ],
  "Resource": "*"
}
...

**注意:**視您的需求以及與 Lambda 函數整合的服務而定,您可能需要授予其他 AWS 服務的其他權限。如需詳細資訊,請參閱 AWS Lambda 權限

修改 Lambda 函數所需的權限

若要授予使用者修改 Lambda 函數的權限,請新增類似下列內容的權限:

**注意:**視您要授與的寫入存取權層級而定,在使用 AWS CLI 或 SDK 時,可能需要授予下列全部或部分權限。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ActionsWhichSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:AddPermission",
        "lambda:RemovePermission",
        "lambda:CreateAlias",
        "lambda:UpdateAlias",
        "lambda:DeleteAlias",
        "lambda:UpdateFunctionCode",
        "lambda:UpdateFunctionConfiguration",
        "lambda:PutFunctionConcurrency",
        "lambda:DeleteFunctionConcurrency",
        "lambda:PublishVersion"
      ],
      "Resource": "arn:aws:lambda:region:AccountID:function:function_name"
    },
    {
      "Sid": "ActionsWhichSupportCondition",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateEventSourceMapping",
        "lambda:UpdateEventSourceMapping",
        "lambda:DeleteEventSourceMapping"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionArn": "arn:aws:lambda:region:AccountID:function:function_name"
        }
      }
    },
    {
      "Sid": "ActionsWhichDoNotSupportResourceLevelPermissions",
      "Effect": "Allow",
      "Action": [
        "lambda:UntagResource",
        "lambda:TagResource"
      ],
      "Resource": "*"
    }
  ]
}

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

您可以使用 lambda:AddPermissionlambda:RemovePermission,對已傳遞政策中包含的主體進一步限制存取權。您也可以將 lambda:UpdateEventSourceMappinglambda:DeleteEventSourceMapping 限制為特定的事件來源映射。如需詳細資訊,請參閱 AWS Lambda 以身分為基礎的 IAM 政策

若要指定客戶受管 AWS Key Management Service (KMS) (AWS KMS) 金鑰來加密環境變數,請使用類似下列內容的 IAM 政策程式碼片段新增其他 KMS 權限:

...
{
  "Sid": "PermissionsForCryptoOperations",
  "Effect": "Allow",
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:CreateGrant"
  ],
  "Resource": "arn:aws:kms:region:AccountID:key/keyID"
},
{
  "Sid": "PermissionsToListExistingKeys",
  "Effect": "Allow",
  "Action": [
    "kms:ListKeys",
    "kms:ListAliases"
  ],
  "Resource": "*"
}
...

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

若要使用 Lambda 主控台修改 Lambda 函數的組態,請新增類似下列內容的權限:

...
{
  "Sid": "PermissionsToViewFunctionsInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings"
  ],
  "Resource": "*"
}
...

調用 Lambda 函數所需的權限

若要使用 AWS CLI 或 SDK 手動調用 Lambda 函數以進行測試,請新增類似下列內容的權限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionToInvoke",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:region:AccountID:function:function_name"
    }
  ]
}

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

若要使用 Lambda 主控台列出 Lambda 函數,請新增類似下列內容的權限:

...
{
  "Sid": "PermissionsToViewFunctionsConfigInConsole",
  "Effect": "Allow",
  "Action": [
    "lambda:ListFunctions",
    "lambda:GetAccountSettings",
    "lambda:GetFunction"
  ],
  "Resource": "*"
}
...

若要允許其他服務調用 Lambda 函數,請針對 AWS Lambda 使用以資源為基礎的政策 。您也可以使用函數政策提供對 Lambda 函數的跨帳戶存取權。下列範例政策可用來允許來自不同 AWS 帳戶的使用者手動調用 Lambda 函數:

{
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "PermissionToInvoke",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::ExternalAccountID:user/username"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:region:AccountID:function:function_name"
    }
  ]
}

**注意:**更新政策以包含您的相關地區、帳戶 ID、函數名稱和 ARN 等。

監視 Lambda 函數所需的權限

若要在 Lambda 主控台的**「監控」**檢視中檢視 Amazon CloudWatch 指標,請新增類似下列內容的權限:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PermissionForCloudWatchMetrics",
       "Effect": "Allow",
       "Action": [
          "cloudwatch:GetMetricStatistics",
          "cloudwatch:GetMetricData"
        ],
        "Resource": "*"
     }
  ]
}

若要授予特定 CloudWatch 指標和 CloudWatch Logs Insights 的權限,請參閱 Amazon CloudWatch 權限參考資料日誌權限參考資料