You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Flutter应用向AWS Lambda/API Gateway发起SigV4签名请求?

从Flutter应用向AWS API Gateway/Lambda发起SigV4签名请求的实现方案

问题背景

需要从Flutter(以iOS为例)应用向AWS Lambda或API Gateway发起带SigV4签名的请求。AWS在2022年5月宣布支持Flutter/Dart原生调用AWS后端服务,但目前公开案例仅有用签名器请求Cognito用户池的场景,暂未见到用于Lambda或API Gateway调用的实现,希望找到基于AWS官方Dart包的可行方案,或其他安全调用AWS服务的方法。

已验证的实现步骤

我已成功实现该需求,具体步骤如下:

1. Flutter端代码实现

以下代码中大写内容为需替换的占位符:

import 'dart:convert';
import 'package:aws_common/aws_common.dart';
import 'package:aws_signature_v4/aws_signature_v4.dart';

const signer = AWSSigV4Signer(
  credentialsProvider: AWSCredentialsProvider.dartEnvironment(),
);

const region = 'REGION';

Future<void> invokeAWSService() async {
  final scope = AWSCredentialScope(
    region: region, 
    service: AWSService.apiGatewayV2,
    dateTime: AWSDateTime(DateTime.now()),
  );

  final request = AWSHttpRequest(
    method: AWSHttpMethod.post,
    uri: Uri.https('HOST.execute-api.REGION.amazonaws.com','/STAGE_NAME'),
    headers: const {
      AWSHeaders.contentType: 'application/x-amz-json-1.1',
    },
    body: json.encode({
      'EVENT_KEY':'EVENT_VALUE',
    }).codeUnits,
  );

  final signedRequest = await signer.sign(
    request, 
    credentialScope: scope,
  );

  final resp = await signedRequest.send();
  final respBody = await resp.decodeBody();
  print('\n\n${signedRequest.headers}\n\n${respBody}\n\n${resp.statusCode}\n\n');
}

2. AWS端资源配置(单一区域内操作)

  • 创建具备编程访问权限的IAM用户,为其附加拥有execute-api:Invoke权限的策略,妥善保存该用户的密钥。
  • 创建Lambda函数(可使用默认测试函数)。
  • 在API Gateway中创建REST类型API(非私有):
    • 选择Regional终端节点
    • 添加POST方法:
      • 授权类型选择IAM
    • 集成类型选择Lambda:
      • 关联目标Lambda函数,不要启用Lambda代理集成
  • 将创建好的API部署至新的阶段并命名。

3. 代码参数替换

编辑Flutter端的Dart代码,填入AWS端创建的资源信息,包括区域、API网关域名、阶段名称等。

4. API Gateway测试

在API Gateway控制台内测试创建的API,注意:若启用了Lambda代理集成会导致502错误,需确保该选项未勾选。

5. 运行Flutter应用

API测试通过后,在终端执行以下命令启动应用(替换为创建的IAM用户密钥):

flutter run --dart-define=AWS_ACCESS_KEY_ID=你的IAM访问密钥 --dart-define=AWS_SECRET_ACCESS_KEY=你的IAM私有密钥

效果验证

我通过按钮触发上述invokeAWSService函数,保留代码中的打印语句后,可看到类似如下的响应结果:

{"statusCode": 200, "body": "\"Hello from Lambda!\""}

此方案已验证可行,但无法保证在所有环境下都适用,欢迎交流提问和建议。

内容的提问来源于stack exchange,提问作者dutch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 00:55:15