代码之家  ›  专栏  ›  技术社区  ›  nocibambi greeness

AWS Secret Manager `ParamValidationError`:`“SecretID”,必须是SecretID、VersionId、VersionStage之一`

  •  0
  • nocibambi greeness  · 技术社区  · 3 年前

    我在lambda函数中从secret Manager访问机密时遇到问题。

    以下是相关代码:

    import boto3
    
    session = boto3.session.Session()
    secretsmanager = session.client(service_name="secretsmanager")
    
    get_secret_value_response = secretsmanager.get_secret_value(
        SecretID="arn:aws:secretsmanager:SECRETNAME"
    )
    secret = get_secret_value_response["SecretString"]
    

    然而,错误消息令人困惑。我在其他地方也没有提到它。

    [ERROR] ParamValidationError: Parameter validation failed:
    Missing required parameter in input: "SecretId"
    Unknown parameter in input: "SecretID", must be one of: SecretId, VersionId, VersionStage
    Traceback (most recent call last):
      File "/var/task/notification_parser.py", line 14, in handler
        get_secret_value_response = secretsmanager.get_secret_value(
      File "/var/runtime/botocore/client.py", line 530, in _api_call
        return self._make_api_call(operation_name, kwargs)
      File "/var/runtime/botocore/client.py", line 919, in _make_api_call
        request_dict = self._convert_to_request_dict(
      File "/var/runtime/botocore/client.py", line 990, in _convert_to_request_dict
        request_dict = self._serializer.serialize_to_request(
      File "/var/runtime/botocore/validate.py", line 381, in serialize_to_request
        raise ParamValidationError(report=report.generate_report())
    

    这个 documentation 显示了一个字符串值,所以我很困惑。

    有什么想法我会出错吗?

    2 回复  |  直到 3 年前
        1
  •  1
  •   Chapi Menge    3 年前

    您的错误很清楚,哪一个是 SecretID SecretId 。您命名错误。

    只需将变量名称更改为 SecretId 而不是 SecretID 最后一个字母应该是小写的。

    但如果你想的话,这里有一个如何使用它的例子

    import boto3
    
    
    SECRET_ARN = "YOUR_SECRET_ARN"
    secret_manager = boto3.client('secretsmanager')
    
    response = secret_manager.get_secret_value(
        SecretId=SECRET_ARN
    )
    
    # this might be a json string so you might need to parse it
    # to parse it you can use json.loads(response['SecretString'])
    print('Secret: ' + response['SecretString']) 
    
        2
  •  0
  •   smac2020    3 年前

    以下是使用Python获取秘密的工作代码。

    # snippet-start:[python.example_code.secrets-manager.GetSecretValue]
        def get_value(self, stage=None):
            """
            Gets the value of a secret.
    
            :param stage: The stage of the secret to retrieve. If this is None, the
                          current stage is retrieved.
            :return: The value of the secret. When the secret is a string, the value is
                     contained in the `SecretString` field. When the secret is bytes,
                     it is contained in the `SecretBinary` field.
            """
            if self.name is None:
                raise ValueError
    
            try:
                kwargs = {'SecretId': self.name}
                if stage is not None:
                    kwargs['VersionStage'] = stage
                response = self.secretsmanager_client.get_secret_value(**kwargs)
                logger.info("Got value for secret %s.", self.name)
            except ClientError:
                logger.exception("Couldn't get value for secret %s.", self.name)
                raise
            else:
                return response
    # snippet-end:[python.example_code.secrets-manager.GetSecretValue]
    
    推荐文章