我一直在AWS中构建Lambda函数,该函数使用以下项S3,SQS,SNS和KMS。在单元测试和实际的lambda测试之间切换时,我编写了一种通用方法来返回IAmazonService接口,该接口如下所示:
public static T GetAmazonClient<T>(ILambdaContext context) where T : IAmazonService, new()
{
T client = default(T);
try
{
if (context.GetType() == typeof(TestLambdaContext))
{
Console.WriteLine("I am a unit test and I will have to build a profile");
//Build the profile for my unit test
client = ClientObjectIhaveBuilt;
}
else
{
Console.WriteLine("I am a Lambda instance and I should inherit my credentials");
client = (T)Activator.CreateInstance(typeof(T));
}
}
catch (Exception ex)
{
//Some logging happens here with the exception
}
Console.WriteLine(JsonConvert.SerializeObject(client));
return client;
}
然后在我的代码中我可以做类似的事情
using (var sqsClient = AmazonClientHelper.GetAmazonClient<AmazonSQSClient>(context))
{
var request = new ChangeMessageVisibilityRequest(SQSURL, message.ReceiptHandle, timeout);
Console.WriteLine("Extending Visibility of SQS Entry");
var response = await sqsClient.ChangeMessageVisibilityAsync(request);
}
在单元测试中,此方法绝对正常,我能够检索消息,从S3中读取以及我希望做的所有其他事情,但是当托管在AWS中时,Lambda似乎并没有创建正确的客户账户。
我已将其托管在自己的测试AWS帐户中,并且可以正常运行,但是当将其上传到公司帐户时,我发现创建的客户端对象未正确实例化,JSON序列化器中的客户端对象输出最后是没有服务URL或凭据的空白对象(这可能是正确的,但看起来很可疑)
当我们尝试扩展SQS项目的可见性时,我们的客户会首先遇到障碍;客户端尝试扩大可见性,但是我们遇到了操作已取消的请求。
NB:请坐,我正在尝试获取stacktrace和序列化客户端输出的副本
答案 0 :(得分:0)
这是一条红鲱鱼;上面的代码没有错。
问题与SQS有关,AWS要求我们使用SQS的URL,这意味着Lambda的VPC需要通过某些NAT / Subnet规则访问Internet或至少AWS Endpoints。< / p>