Python 模拟 AWS SSM

问题描述 投票:0回答:2

我已经编写了一段代码,可以为我获取SSM参数

import boto3
    
client = boto3.client('ssm')
    
def lambda_handler(event, context):
    return client.get_parameter(Name=event["param"], WithDecryption=True)

if __name__ == '__main__':
    print(lambda_handler({"param": "/mypath/password"}, ""))

但是,我无法为其编写测试用例,我尝试使用

moto
但由于某种原因,它仍然为我提供了SSM商店的实际值

import os

import boto3
from moto import mock_ssm
import pytest

from handler import lambda_handler

@pytest.fixture
def aws_credentials():
    os.environ["AWS_ACCESS_KEY_ID"] = "testing"
    os.environ["AWS_SECRET_ACCESS_KEY"] = "testing"
    os.environ["AWS_SECURITY_TOKEN"] = "testing"
    os.environ["AWS_SESSION_TOKEN"] = "testing"

@mock_ssm
def test_ssm():
    ssm = boto3.client('ssm')
    ssm.put_parameter(
        Name="/mypath/password",
        Description="A test parameter",
        Value="this is it!",
        Type="SecureString"
    )
    resp = lambda_handler({"param": "/mypath/password"}, "")
    assert resp["Parameter"]["Value"] == "this is it!"

我是否错过了一些无意中听到的东西,我应该做什么才能使其工作,或者是否有其他方法可以在 python 中模拟 SSM。

python amazon-web-services mocking pytest moto
2个回答
3
投票

当您通过

ssm
修补
@mock_ssm
时,您已经在handler.py中将变量
handler.client
实例化为
boto3
客户端的真实实例,因此它不是修补后的版本。

解决方案1:

仅在 lambda 处理程序期间初始化客户端,以便补丁在创建时就已经生效。

处理程序.py

import boto3

# client = boto3.client('ssm')  # Remove this instantiation

def lambda_handler(event, context):
    client = boto3.client('ssm')  # Move it here
    return client.get_parameter(Name=event["param"], WithDecryption=True)

if __name__ == '__main__':
    print(lambda_handler({"param": "/mypath/password"}, ""))

解决方案2:

仅在补丁生效后导入/执行 handler.py 文件。

test_handler.py

...
# from handler import lambda_handler  # Remove this import
...
@mock_ssm
def test_ssm():
    from handler import lambda_handler  # Move it here
    ...
...

解决方案3

补丁生效后重新加载 handler.py。

...
@mock_ssm
def test_ssm():
    from importlib import reload
    import sys
    reload(sys.modules['handler'])
    ...
...

输出

$ pytest -q -rP
============================================================================================ PASSES ============================================================================================
1 passed in 1.35s

0
投票

从moto==5.0.0开始,现在是:

from moto import mock_aws


...
@mock_aws
def test_ssm():
    from importlib import reload
    import sys
    reload(sys.modules['handler'])
    ...
...
© www.soinside.com 2019 - 2024. All rights reserved.