如何在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
相关产品推荐
相关产品推荐

