文档在控制台中的操作非常清楚,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中复制这个例子。
从您的描述中,我认为您没有为您的集成提供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函数。
在您链接的文档中(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"
}
]
}
以下不是全套,但这应该会给你一些想法。我在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。