2017-08-06 111 views
6

我在C#中有一个Lambda,我试图访问存储在ECQ参数存储中的参数。参数存储为字符串值。使用AmazonSimpleSystemsManagementClient GetParameters失败

我的Lambda配置为使用现有角色。在IAM,我已经分配了以下政策作用:

  • AmazonRedshiftReadOnlyAccess
  • AmazonKinesisReadOnlyAccess
  • AmazonVPCFullAccess
  • AWSLambdaExecute
  • AmazonSSMReadOnlyAccess
  • AWSLambdaVPCAccessExecutionRole

拉姆达在我们的VPC内部运行,如果参数值是硬编码的,它会成功执行。

我的代码来获取参数是:

var client = new AmazonSimpleSystemsManagementClient(RegionEndpoint.APSoutheast2); 
var request = new GetParametersRequest 
{ 
    Names = new List<string>{ "ParameterName" } 
}; 
var response = client.GetParametersAsync(request).Result; 
var value = response.Parameters.Single().Value; 

我有日志记录之前和调用GetParametersAsync后,并没有得到调用后的记录。

我需要做什么才能从Lambda获取参数值?

+0

http://docs.aws.amazon.com/lambda/latest/dg/vpc.html – Ramankingdom

回答

3

问题是由LAMBDA我们VPC的内部运行造成的。访问SSM是通过互联网完成的,所以我必须配置一个NAT网关,让Lambda访问互联网。

完成此操作后,Lambda可以成功访问SSM参数。

1

你应该有类似的东西:

public async Task<Response> ProcessS3ImageResizeAsync(SimpleS3Event input) 
{ 
    var response = await client.DoAsyncWork(input); 
    return response; 
} 

在异步调用的响应不是立即,所以你需要之前等待。

的更多信息:

[1] http://docs.aws.amazon.com/lambda/latest/dg/dotnet-programming-model-handler-types.html#dot-net-async

+0

示例直接来自我的源代码,需要修改以适合您的情况。一旦这个想法如此简单,这不应该是一个大问题。 – mico

+0

感谢您的回答。使用我的个人访问密钥通过Visual Studio运行时,我的代码已经可用。它不能在lambda中运行 - 我相信这是一个IAM问题,但无法弄清楚。 – Anthony

+0

很好,你找到了答案。思考更多的情况,await在GetParametersAsync中使用,而不是在调用它时使用。 – mico