You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Moto中添加自定义AWS SSM前缀参数以通过Lambda测试?

问题描述

我使用Moto模拟boto3.client('ssm')执行测试。Moto内置了部分/aws/前缀的SSM默认参数,但限制添加新的此类参数,尝试添加会触发报错。

我的Lambda函数依赖参数/aws/service/ecs/optimized-ami/amazon-linux-2/recommended,这导致测试失败。我尝试通过猴子补丁修改模拟的SSM客户端但未成功,以下是我的代码:

app.py

import boto3
from loguru import logger


@logger.catch()
def lambda_handler(event, context):
    ssm_client = boto3.client("ssm", "eu-west-1")

    ami_param_name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-ebs"
    ami_param_value = ssm_client.get_parameter(Name=ami_param_name)

    ecs_param_name = "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended"
    ecs_param_value = ssm_client.get_parameter(Name=ecs_param_name)

    return [ami_param_value, ecs_param_value]

test.py

import os
from unittest import mock

import boto3
import pytest
from moto import mock_ssm

from src.app import lambda_handler

AWS_REGION = 'eu-west-1'


@pytest.fixture(scope="function")
def aws_credentials():
    """Mocked AWS Credentials for moto."""
    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"


@pytest.fixture(scope="function")
def mock_ssm_client(aws_credentials):
    with mock_ssm():
        client = boto3.client("ssm", region_name=AWS_REGION)

        # already present in moto
        # client.put_parameter(
        #     Name='/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-ebs',
        #     Type='String',
        #     Value='ami-stdparam'
        # )

        # What the lambda requires
        # client.put_parameter(
        #     Name='/aws/service/ecs/optimized-ami/amazon-linux-2/recommended',
        #     Type='String',
        #     Value='{"image_id": "ami-ecsparam"}'
        # )

        def side_effect(path):
            if path == "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended":
                return_value = {
                    "Parameter": {
                        "Name": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended",
                        "Type": "String",
                        "Value": "{\"ecs_agent_version\":\"1.63.1\",\"ecs_runtime_version\":\"Docker version 20.10.13\",\"image_id\":\"ami-002e2fef4b94f8fd0\",\"image_name\":\"amzn2-ami-ecs-hvm-2.0.20220921-x86_64-ebs\",\"image_version\":\"2.0.20220921\",\"os\":\"Amazon Linux 2\",\"schema_version\":1,\"source_image_name\":\"amzn2-ami-minimal-hvm-2.0.20220912.1-x86_64-ebs\"}",
                        "Version": 94,
                        "LastModifiedDate": 1664230158.399,
                        "ARN": "arn:aws:ssm:eu-west-1::parameter/aws/service/ecs/optimized-ami/amazon-linux-2/recommended",
                        "DataType": "text"
                    }
                }

                return return_value
            else:
                return client.get_parameter(path)

        client.get_parameter = mock.patch(
            'boto3.client.get_parameter',
            side_effect=side_effect
        )
        yield client


def test_lambda_handler(mock_ssm_client):
    # Arrange

    # Act
    results = lambda_handler('', 'test')

    # Assert
    assert len(results) == 2

内容的提问来源于stack exchange,提问作者thoroc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:25:33