当前位置: 首页 > 知识库问答 >
问题:

如何在CDK中将API网关与s3集成

裴昊阳
2023-03-14

文档在控制台中的操作非常清楚,https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html,但在CDK中复制真的很痛苦。

我的问题是如何在CDK中创建一个以s3(中间没有lambda)为支持的RESTAPI,或者至少如何创建apigateway。AWS整合工作。

我试过很多方法,发现自己是在瞎编代码。我已经在restApi、lambda、sqs、dynamoDB、s3之间进行了多次集成,所有这些都非常简单。但直接将API网关与S3集成将让我大哭一场。

我需要restAPI将请求负载直接存储到S3存储桶中。

这是我已经尝试过的:

在RestApi中添加一个政策声明:

const apiResourcePolicy = new iam.PolicyDocument({
        statements: [
          new iam.PolicyStatement({
            effect: iam.Effect.ALLOW,
            actions: ['s3:Put*'],            
            resources: [bucket.bucketName],
            principals: [new ServicePrincipal('apigateway.amazonaws.com')]
          })          
        ]
      });

const api = new apigateway.RestApi(this, "dispatch-api", {
        restApiName: "my api name",
        description: "api description",
        policy: apiResourcePolicy        
      });

我认为这应该足以解决权限问题,但是当我将AWS集成添加到API时,像这样:

const getS3Integration = new apigateway.AwsIntegration({
        service: "s3",        
        path: bucket.bucketName,                               
      });

api.root.addMethod("PUT", getS3Integration, {
    requestValidator: requestValidator,
    requestModels: {"application/json": myModel},
  });

我得到:

1:41:11 PM | CREATE_FAILED        | AWS::ApiGateway::Method           | XXXXXXXXXXXXXXXX
Role ARN must be specified for AWS integrations (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException; Request ID: xxxxxxxxxxxxxxxxxxxxx; Proxy:
null)

我不知道如何指定角色ARN,我在文档中没有找到。也不知道是否需要将策略添加到restAPI。我试图在CDK中复制这个例子。

共有3个答案

东门胤
2023-03-14

从您的描述中,我认为您没有为您的集成提供IAM角色。您提供的策略仅适用于RestApi,这是API的基于资源的策略。换句话说,它不适用于您的集成,而是指定谁可以执行您的API。如果您想公开您的API,通常不会使用它。

对于AWS集成,您应该使用集成选项为IAM角色提供S3权限。具体来说,通过凭据选项:

API网关承担的IAM角色。

CDK映射到的CloudFormation文档中有关于集成的更多详细信息凭证

集成所需的凭据。要指定API网关承担的AWS标识和访问管理(IAM)角色,请指定该角色的亚马逊资源名称(ARN)。要要求从请求传递调用方的标识,请指定arn:aws:iam:::user/。

若要对AWS Lambda(Lambda)函数使用基于资源的权限,请不要指定此属性。使用AWS::Lambda::权限资源允许API网关调用该函数。有关详细信息,请参阅AWS Lambda开发人员指南中的允许Amazon API网关调用Lambda函数。

岳风畔
2023-03-14

在您链接的文档中(https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html),部分“设置API调用Amazon S3操作的IAM权限”,您需要使用的策略与您编码的策略完全不同。

如果应用于bucket,您的策略会说:如果请求来自服务“api网关”,则允许put:操作。这种方法适用于其他用例。

根据文档,您需要:

  • 创建一个角色

政策(1)应该是显而易见的,文件中给出的(2)是:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
} 
龚星洲
2023-03-14

以下不是全套,但这应该会给你一些想法。我在SQS上做过类似的事情,那时我也哭了


    const bucket = new s3.Bucket(this, 'storage');

    const executeRole = new iam.Role(this, "role", {
      assumedBy: new iam.ServicePrincipal('apigateway.amazonaws.com'),
      path: "/service-role/"
    });

    bucket.grantReadWrite(executeRole);

    const api = new apigateway.RestApi(this, 's3api');

    const s3Integration = new apigateway.AwsIntegration({
      service: 's3',
      integrationHttpMethod: "PUT",
      path: "{bucket}",
      options : {
        credentialsRole: executeRole,
        // should have all kind of path mapping..        
      }
    })

    api.root.addResource("{folder}").addMethod("PUT", s3Integration, {
      methodResponses: [
        {
          statusCode: "200"
        }
      ]});
  }
 类似资料:
  • 我有一个现有的域名注册在AWS路由53和我已经建立了一个自定义的域名在API网关。在控制台中,我可以配置一些东西,使xxxxx.zenxxxxxxfoundry.com从外部到达API GatewayAPI,然后通过Lambda函数。 现在我想用AWS CDK实现这一点。 我尝试了以下方法: 它生成ok,但当我运行时,我得到一个相当钝的错误: 打开并没有太大帮助:附加信息: 我查看了整个堆栈脚本,

  • 我有一个关于Cognito和API网关集成的问题,我希望你能帮助我。我正在考虑制作一个应用程序,我希望与第三方(Facebook,Twitter...)进行身份验证,所以我放弃了Cognito用户池,然后我有了Cognito身份池,但这是我怀疑增长的地方。 如何将其与API网关集成 谢谢你的帮助

  • 我试图将AWS API网关与AWS lambda函数集成。集成工作完美无缺,直到我在集成请求中使用“Lambda代理集成”。 当我在集成请求中选中“使用Lambda代理集成”时,我开始得到: “由于配置错误,执行失败:Lambda代理响应格式错误” 我在谷歌上搜索了一下,意识到我需要以某种格式返回响应: 然而,尽管如此,我仍然看到同样的错误。我做错了什么? 这就是我的Lambda函数的样子: 当我

  • 我试图创建一个短信机器人使用Twilio,Aws API网关和Aws Lambda的帮助。 网址:https://xxxxxxx.execute-api.us-west-2.amazonaws.com/latest/ 参数fromcity=Moorestown&to=%2b18569246402&fromzip=08057&body=hello&toCountry=us&fromstate=nj&

  • 我在API网关中创建了一个API,用于将音频文件上载到s3,该文件作为多部分/表单数据从本地PC发送。 API集成请求如下所示 在URL路径参数中,添加bucket作为param,直接添加bucket名称 当我尝试上载文件时,收到错误响应, 需要做哪些更改?

  • 我们使用Kong api网关作为所有api的单一网关。我们面临着一些api(1500-2000毫秒)的延迟问题。后来当我们检查时,延迟是由于“速率限制”插件而产生的。当我们禁用插件时,延迟会提高,响应与我们直接从IP获得的响应相同(约300毫秒)。我试图设置redis节点来缓存数据库查询,我不确定我们如何配置Kong从redis本身读取。我们正在为Kong使用postgreql。