一个lambda的InvalidChiperException,但另一个不

问题描述

  (data[0]["bar"] as List<Map<String,String>>).add({"foo": "bar"});

我已经尝试了上面的两个代码,已经验证了两个lambda函数都使用相同的VPC,专用子网,并且两个安全组均已添加到kms端点。他们都使用相同的确切角色。他们俩都使用相同的S3 zip软件包,并且都在.decrypt的代码中使用了同一行(我复制并粘贴了代码,这是上面的第二个代码)。

其中一个正常运行,另一个抛出以下错误

db_password = boto3.client('kms').decrypt(CiphertextBlob=b64decode(os.environ['DB_PASSWORD']))['Plaintext']

services_region = 'us-east-1'    
db_password = boto3.client('kms',region_name=services_region).decrypt(CiphertextBlob=b64decode(os.environ['DB_PASSWORD']))['Plaintext']

两者之间唯一的区别是密码不同。但是,我使用与编程用户不同的密码对其进行了测试,似乎没有什么区别。

lambda上的权限标签显示An error occurred (InvalidCiphertextException) when calling the Decrypt operation: : InvalidCiphertextException Traceback (most recent call last): File "/var/task/awsfinbi_workdocs_api_pull/bin/api_pull.py",line 143,in lambda_handler get_data() File "/var/task/awsfinbi_workdocs_api_pull/bin/api_pull.py",line 100,in get_data db_load(df,s) File "/var/task/awsfinbi_workdocs_api_pull/bin/api_pull.py",line 122,in db_load raise e File "/var/task/awsfinbi_workdocs_api_pull/bin/api_pull.py",line 112,in db_load db_password = boto3.client('kms',region_name=services_region).decrypt(CiphertextBlob=b64decode(os.environ['DB_PASSWORD']))['Plaintext'] File "/var/runtime/botocore/client.py",line 316,in _api_call return self._make_api_call(operation_name,kwargs) File "/var/runtime/botocore/client.py",line 635,in _make_api_call raise error_class(parsed_response,operation_name) botocore.errorfactory.InvalidCiphertextException: An error occurred (InvalidCiphertextException) when calling the Decrypt operation:

我尝试创建一个密钥并使用它,我也尝试使用所有其他密钥。都抛出此错误

我可能想念这个问题吗?

解决方法

好吧,我偶然发现了一个答案。

关于我的代码的1件事(尚未发布)是我有一个for循环,该循环多次调用了解密。显然,这绝对不应该做。因此,我将用于解密的代码移出了for循环。

即使将它从for循环中删除也无法解决问题,但是当我将其设置为两行时,它就起作用了:

ENCRYPTED = os.environ['DB_PASSWORD']
db_password = boto3.client('kms').decrypt(
    CiphertextBlob=b64decode(ENCRYPTED),EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']}
)['Plaintext'].decode('utf-8')

我以前曾尝试过上下文,但当时对所有一行都没有帮助。我不确定为什么它不喜欢全部包含一行,但是上面的方法仍然有效。