AWS获取通用客户端

时间:2019-02-11 16:08:23

标签: c# amazon-web-services .net-core aws-lambda

我一直在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和序列化客户端输出的副本

1 个答案:

答案 0 :(得分:0)

这是一条红鲱鱼;上面的代码没有错。

问题与SQS有关,AWS要求我们使用SQS的URL,这意味着Lambda的VPC需要通过某些NAT / Subnet规则访问Internet或至少AWS Endpoints。< / p>