簡體   English   中英

Lambda function 無法訪問 Secrets Manager

[英]Lambda function can't access Secrets Manager

我寫了一個 lambda function 來訪問數據庫,所以第一步是從 AWS Secrets Manager 獲取秘密。 我有一個私有 VPC 以及與 lambda function 關聯的 su.nets、NAT 網關和安全組。我還有secretsmanager.Secret.grantRead(lambda_exec_role) ,因此 lambda 應該可以訪問 Secrets Manager。

出於某種原因,當我在 API 網關中對其進行測試時,我在 CloudWatch 中得到了“errno”:“ETIMEDOUT”和“code”:“NetworkingError”。 從我在 API 中的打印日志來看,獲取機密失敗。

我還嘗試在此處為 Secrets Manager 添加 VPC 端點,但仍然出現相同的錯誤。

如果這里有人可以幫助我或提供一些提示,我將不勝感激。

非常感謝!

我也有類似的問題,對我有用的是將kms:Decrypt添加到 IAM 策略。 因為根據 AWS 官方文檔:

如果密鑰是使用客戶管理的密鑰而不是 Amazon Web 服務管理的密鑰 aws/secretsmanager 加密的,那么您還需要該密鑰的 kms:Decrypt 權限。 https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_secret_value

附加到 Lambda 的 IAM 策略應該類似於:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*"
        }
    ]
}

您可能希望根據您的要求將Resources限制為更具體的內容。 希望它也適合你。

我也有一個 lambda 獲得秘密內容。

它們是您可以嘗試的幾件事:

#1 確保您有權獲取秘密值,我會給您我的工作配置:

  • Allow:secretsmanager:GetSecretValue 在你的秘密上
  • Allow:secretsmanager:DescribeSecret 在你的秘密上
  • Allow:secretsmanager:ListSecrets 在所有資源上

#2 我的 VPC 和子網也有問題。 如果配置錯誤,您將無法調用 Secret Manager API。

  • 為您的 lambda 切換到 no VPC 並檢查您是否可以獲取您的密鑰。 如果它有效,則意味着您的 VPC/子網配置有問題。
  • 檢查您的子網配置:
    • 在公共子網上,你可以為秘密管理器配置一個特定的端點,雖然我不能讓它工作,不知道為什么。
    • 在私有子網上,您需要配置一個 NAT 網關,以便能夠調用 Secret Manager API。

希望有一天它可以幫助某人。 :)

如果其他人在解決Secrets Manager lambda 擴展的問題時遇到這個問題,我想分享我在使用 Nodejs18.x 運行時(此時是全新的)實施時的經驗。 我正在利用這個新運行時的新頂級等待,並希望在 init 時(在處理程序之外)從 SM 檢索我的秘密。 我所有的嘗試都失敗了,我收到了分機的回復

尚未准備好服務流量,請稍候

在我的處理程序 function 中移動 http 調用(到分機的端口)立即解決了這個問題。

下面是我如何讓它在serverless.yml中工作。

AWS 參考: https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html#vpc-endpoint

以下 yml 出現在路徑resources.Resources.YourVPCEndpointNameHere下:

# Provides access from the VPC to Secrets Manager
# See https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html#vpc-endpoint
Type: AWS::EC2::VPCEndpoint
Properties:
  VpcEndpointType: Interface
  ServiceName: com.amazonaws.#{AWS::Region}.secretsmanager
  PrivateDnsEnabled: true

  # Reference your VPC here
  VpcId: !Ref EC2VPC

  # Reference your subnet ids here
  SubnetIds:
    - !Ref EC2SubnetA
    - !Ref EC2SubnetB
    - !Ref EC2SubnetC

  # Reference your security group(s) here
  SecurityGroupIds:
    - !Ref EC2SecurityGroup

提示:您需要插件serverless-pseudo-parameters才能使#{AWS::Region}工作。

根據錯誤的性質 -.network timeout - 我假設即使您擁有權限也無法獲取您的秘密。

由於您在 VPC 中處理 Lambda,請注意有兩種方法可以將您的 Lambda 放入 VPC 中:

  • 在公共 su.net 中:在這種情況下,您的Lambda無法訪問 inte.net,因此您唯一的選擇是為 Secrets Manager 配置 VPC 端點,或者
  • 在私有 su.net 中:在這種情況下,您的私有 su.net 可以將0.0.0.0/0流量路由到 NAT 網關,然后再到 Inte.net 網關(通過公共 su.net)。 這使您可以選擇通過其公共端點(即通過 inte.net)或再次通過 VPC 端點訪問 Secrets Manager。

為了解決這個問題,我的解決方案需要兩個步驟

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM