【问题标题】:AWS SAM local API cannot access Systems Management parametersAWS SAM 本地 API 无法访问系统管理参数
【发布时间】:2020-09-05 13:30:29
【问题描述】:

我有一个使用 AWS SAM 创建的 C# AWS Lambda 函数。该函数尝试使用以下代码从系统管理中获取参数:

public async Task<string> GetConfiguration(string parameterName)
{
    var request = new GetParameterRequest
    {
        Name = $"/project-name/{parameterName}",
        WithDecryption = true
    };

    using (var client = new AmazonSimpleSystemsManagementClient(RegionEndpoint.EUWest1))
    {
        var response = await client.GetParameterAsync(request);
        return response.Parameter.Value;
    }
}

SAM 模板指定函数以具有ssm:GetParameter* 权限的 IAM 用户身份运行。当我将该函数部署到 AWS 时,此代码完全按预期工作。如果我在 Visual Studio 中运行,API 也可以访问参数。

但是,当我在本地运行代码时: sam local start-api

我得到了这个例外:

[错误] Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction: 响应请求的未知错误: AmazonSimpleSystemsManagementException: Amazon.SimpleSystemsManagement.AmazonSimpleSystemsManagementException: 请求中包含的安全令牌无效 ---> Amazon.Runtime.Internal.HttpErrorResponseException:引发了 Amazon.Runtime.Internal.HttpErrorResponseException 类型的异常。在 Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync(CancellationToken 取消令牌)在 Amazon.Runtime.Internal.HttpHandler1.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.Unmarshaller.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.ErrorHandler.InvokeAsync[T](IExecutionContext 执行上下文) --- 内部异常堆栈跟踪结束 --- 在 Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException(IExecutionContext executionContext, HttpErrorResponseException 异常)在 Amazon.Runtime.Internal.ExceptionHandler1.Handle(IExecutionContext executionContext,异常异常)在 Amazon.Runtime.Internal.ErrorHandler.ProcessException(IExecutionContext executionContext,异常异常)在 Amazon.Runtime.Internal.ErrorHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.EndpointDiscoveryHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.EndpointDiscoveryHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync[T](IExecutionContext 执行上下文)在 Amazon.Runtime.Internal.MetricsHandler.InvokeAsync[T](IExecutionContext 执行上下文)

我正在努力弄清楚为什么或如何让它发挥作用。

【问题讨论】:

  • 我了解到您使用 AWS SAM CLI 在本地部署您的 Lambda 函数。您在运行本地 Lambda 时使用哪个 SSM 端点?您是启动 SSM 服务的本地模拟还是连接到云中的端点?如果后者为真,您如何为您的 Lambda 指定权限?你能粘贴你的模板吗?
  • start-api 也需要--profile TEXT。也许您必须指定要使用的正确配置文件。似乎是一些权限问题:“请求中包含的安全令牌无效”
  • @Marcin 我已经尝试指定--profile=default 这是我本地配置文件的名称,但这没有什么区别。有没有办法查看函数作为哪个 IAM 角色运行?

标签: c# amazon-web-services aws-lambda aws-sam aws-sam-cli


【解决方案1】:

我认为您的本地机器尚未配置为调用 AWS API。

当您在本地计算机上使用 AWS 运行代码时,您必须确认您已使用客户端凭据配置了您的环境。

要确认这一点,请确认您已为您的 IAM 用户生成访问密钥。在这里,您将找到有关如何查找访问密钥以及如何生成新密钥的详细答案:https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey

下一步是配置本地环境。您必须在本地计算机上存储访问密钥和机密。你有两个选择:

  • 使用安全配置文件
  • 使用环境变量

如果您选择第一个选项,请从您的 CLI(终端)命令 aws configure 运行。然后,您将被要求输入您的凭据并为默认配置文件设置默认区域和输出。所有代码调用(包括您的 SDK)都使用此配置文件。 您可以检查文件 ~/.aws/credentials 中的所有可用配置文件(在 Windows 上位于 C:/Users/&lt;your-username&gt;/.aws/credentials。可能是您已经使用非默认名称配置了配置文件。然后,您的 C# 代码需要显式调用此配置文件 -这同样适用于 CLI 调用,就像 Marcin 在您的问题下方的评论中指出的那样。

如果选择第二个选项,则需要设置环境变量:AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。有关环境变量的详细信息,请参见此处:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2021-08-03
    • 2018-07-30
    • 2013-07-16
    相关资源
    最近更新 更多