我如何从 boto3 模拟 ssm?

Mar*_*oma 4 pytest boto3 moto

我尝试过 moto,但我总是得到:

botocore.exceptions.ClientError:调用 GetParameter 操作时发生错误 (UnrecognizedClientException):请求中包含的安全令牌无效。

MVCE:test_example.py

import moto
import boto3


def ssm():
    boto3.setup_default_session()
    with moto.mock_ssm():
        ssm = boto3.client('ssm', region_name='us-east-1',
                           aws_access_key_id='testing',
                           aws_secret_access_key='testing')
        ssm.put_parameter(
            Name="/foo/bar",
            Description="A test parameter",
            Value="this is it!",
            Type="SecureString",
        )
        yield ssm


def get_ssm_param(ssm_parameter_name):
    session = boto3.Session()
    ssm_client = session.client("ssm")
    param = ssm_client.get_parameter(Name=ssm_parameter_name, WithDecryption=True)
    return param["Parameter"]["Value"]


def test_get_ssm_param():
    foo = get_ssm_param('/foo/bar')
    assert foo == "this is it!"
Run Code Online (Sandbox Code Playgroud)

执行

pytest test_example.py
Run Code Online (Sandbox Code Playgroud)

我的系统

moto==1.3.13
boto==2.49.0
boto3==1.9.201
botocore==1.12.201
Run Code Online (Sandbox Code Playgroud)

Mar*_*oma 11

一位同事向我展示了这是有效的:

from moto import mock_ssm
import boto3


def get_ssm_param(ssm_parameter_name):
    session = boto3.Session()
    ssm_client = session.client("ssm")
    param = ssm_client.get_parameter(Name=ssm_parameter_name, WithDecryption=True)
    return param["Parameter"]["Value"]

@mock_ssm
def test_get_ssm_param():
    ssm = boto3.client('ssm')
    ssm.put_parameter(
        Name="/foo/bar",
        Description="A test parameter",
        Value="this is it!",
        Type="SecureString",
    )
    foo = get_ssm_param('/foo/bar')
    assert foo == "this is it!"
Run Code Online (Sandbox Code Playgroud)

但是当您将凭据添加到boto3.client.