使用 Cloudformation 的 AWS Api Gateway 代理资源?

2024-03-27

我正在尝试从 API 网关端点代理配置为网站的 S3 存储桶。我使用控制台成功配置了端点,但无法使用 Cloudformation 重新创建配置。

经过大量的试验、错误和猜测,我想出了以下 CF 堆栈模板,它让我非常接近:

Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: ApiDocs

  Resource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      ParentId: !GetAtt Api.RootResourceId
      RestApiId: !Ref Api
      PathPart: '{proxy+}'

  RootMethod:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      HttpMethod: ANY
      ResourceId: !GetAtt Api.RootResourceId
      RestApiId: !Ref Api
      AuthorizationType: NONE
      Integration:
        IntegrationHttpMethod: ANY
        Type: HTTP_PROXY
        Uri: 'http://my-bucket.s3-website-${AWS::Region}.amazonaws.com/'
        PassthroughBehavior: WHEN_NO_MATCH
        IntegrationResponses:
          - StatusCode: 200

  ProxyMethod:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      HttpMethod: ANY
      ResourceId: !Ref Resource
      RestApiId: !Ref Api
      AuthorizationType: NONE
      RequestParameters:
        method.request.path.proxy: true
      Integration:
        CacheKeyParameters:
          - 'method.request.path.proxy'
        RequestParameters:
          integration.request.path.proxy: 'method.request.path.proxy'
        IntegrationHttpMethod: ANY
        Type: HTTP_PROXY
        Uri: 'http://my-bucket.s3-website-${AWS::Region}.amazonaws.com/{proxy}'
        PassthroughBehavior: WHEN_NO_MATCH
        IntegrationResponses:
          - StatusCode: 200

  Deployment:
    DependsOn:
      - RootMethod
      - ProxyMethod
    Type: 'AWS::ApiGateway::Deployment'
    Properties:
      RestApiId: !Ref Api
      StageName: dev

使用此模板我可以成功获取存储桶网站的根目录,但代理资源给了我一个 500:

curl -i https://abcdef.execute-api.eu-west-1.amazonaws.com/dev/index.html
HTTP/1.1 500 Internal Server Error
Content-Type: application/json
Content-Length: 36
Connection: keep-alive
Date: Mon, 11 Dec 2017 16:36:02 GMT
x-amzn-RequestId: 6014a809-de91-11e7-95e4-dda6e24d156a
X-Cache: Error from cloudfront
Via: 1.1 8f6f9aba914cc74bcbbf3c57e10df26a.cloudfront.net (CloudFront)
X-Amz-Cf-Id: TlOCX3eemHfY0aiVk9MLCp4qFzUEn5I0QUTIPkh14o6-nh7YAfUn5Q==

{"message": "Internal server error"}

我不知道如何调试那个 500。

为了找出可能出现的问题,我比较了aws apigateway get-resource在我在控制台中手动创建的资源(正在运行)和 Cloudformation 制作的资源(未运行)上。资源看起来完全一样。的输出get-method然而,略有不同,我不确定是否可以使用 Cloudformation 使它们完全相同。

工作方式配置:

{
  "apiKeyRequired": false,
  "httpMethod": "ANY",
  "methodIntegration": {
    "integrationResponses": {
      "200": {
        "responseTemplates": {
          "application/json": null
        },
        "statusCode": "200"
      }
    },
    "passthroughBehavior": "WHEN_NO_MATCH",
    "cacheKeyParameters": [
      "method.request.path.proxy"
    ],
    "requestParameters": {
      "integration.request.path.proxy": "method.request.path.proxy"
    },
    "uri": "http://muybucket.s3-website-eu-west-1.amazonaws.com/{proxy}",
    "httpMethod": "ANY",
    "cacheNamespace": "abcdefg",
    "type": "HTTP_PROXY"
  },
  "requestParameters": {
    "method.request.path.proxy": true
  },
  "authorizationType": "NONE"
}

不起作用的配置:

{
    "apiKeyRequired": false,
    "httpMethod": "ANY",
    "methodIntegration": {
        "integrationResponses": {
            "200": {
                "responseParameters": {},
                "responseTemplates": {},
                "statusCode": "200"
            }
        },
        "passthroughBehavior": "WHEN_NO_MATCH",
        "cacheKeyParameters": [
            "method.request.path.proxy"
        ],
        "requestParameters": {
            "integration.request.path.proxy": "method.request.path.proxy"
        },
        "uri": "http://mybucket.s3-website-eu-west-1.amazonaws.com/{proxy}",
        "httpMethod": "ANY",
        "requestTemplates": {},
        "cacheNamespace": "abcdef",
        "type": "HTTP_PROXY"
    },
    "requestParameters": {
        "method.request.path.proxy": true
    },
    "requestModels": {},
    "authorizationType": "NONE"
}

差异:

  • 工作配置有responseTemplates set to "application/json": null。据我所知,没有办法明确设置映射null使用云信息。我的 CF 方法在这里只有一个空对象。
  • 我的CF方法有"responseParameters": {},,而工作配置没有responseParameters at all
  • 我的CF方法有"requestModels": {},,而工作配置没有requestModels at all

在控制台中比较两者,看起来完全一样。

我现在束手无策:我做错了什么?使用 Cloudformation 可以实现这一点吗?


答:以上是正确的。我通过一系列步骤得出了这个解决方案,并一遍又一遍地重新应用该模板。删除堆栈并使用此配置重新部署它达到了预期的效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Cloudformation 的 AWS Api Gateway 代理资源? 的相关文章

随机推荐

  • 尝试防止将重复值添加到数组中。

    当我在点击事件上向数组添加重复值时 我的项目遇到了问题 当我将单击的项目的值推入数组时openedCards push card 该代码允许将多个项目值添加到数组中 从而创建与单个项目匹配的值 我尝试像这样包装这段代码if inArray
  • “AuthDataResult”类型的值没有成员“providerID”Firebase 5.0

    我在使用最新版本的 FirebaseAuth 5 0 时遇到问题 这是我的代码 func registerUser withEmail email String andPassword password String userCreatio
  • AHK:在 Numlock 打开时重新映射数字键盘,使其行为类似于在 Numlock 关闭时的数字键盘

    我想重新映射 Numlock On 的数字键盘 使其表现得像 Numlock Off 的数字键盘 包括能够在按住 Shift Ctrl 的情况下扩展选择范围 我遇到的问题如下 Numpad8 Up 当按下 shift numpad8 时 光
  • JQuery DataTables - 行分组、求和、可折叠、导出

    我已经使用 JQuery DataTables 很长时间了 这是我第一次使用行分组 我找到了一个很好的例子来说明我想从哪里开始 Grouping http www cscc edu resources app data datatables
  • 具有自定义行布局的多选警报对话框

    我需要创建一个包含多个选择项的 AlertDialog 但在尝试将自定义布局文件设置到内部 ListView 时遇到一些麻烦 对于单选项 我使用一个以 ListAdapter 作为参数的构造函数 这样我可以为每行设置正确的布局资源 buil
  • 使用 jQuery 获取网站信息

    使用 jQuery 有没有办法获取网站信息 可能是元数据和图像 我想要完成的一个例子是 当我在 Facebook 上分享链接时 它会提取相关图像并显示网站 文章 中的文本简介 有没有办法使用 jQuery 使用 ajax 轻松完成此任务 好
  • Typo3 在特定页面的 body 标签中添加类

    我试图弄清楚如何有条件地将类添加到特定页面的正文标记 我试图通过typoscipt 来做到这一点 但一直无法弄清楚 也许有更好的方法来做到这一点 该网站使用的是 Typo3 版本 4 4 6 我试过这个没有用 page 4 bodyTag
  • Rails 中的范围和范围

    有人可以解释一下这个方法的作用以及我可以传递给它什么吗 scoped options nil Returns an anonymous scope 那么作用域方法的作用是什么 读完文档后我不明白 在 ActiveRecord 中 所有查询构
  • 有没有办法以编程方式测试浏览器 GPU 加速?

    我想在我当前正在开发的网站上添加一些 花里胡哨 的功能 但我不想让我的用户陷入整个机器的困境 有没有办法可以测试当前浏览器是否支持 GPU 加速 我可以只检查 UserAgents 但我总是听说它不够准确 无法信任 我想我可以构建一个画布元
  • 禁用 Java ImageIO 色度子采样

    我正在尝试使用 ImageIO 将 BufferedImage 保存为 JPEG 但即使使用 100 质量进行保存 我也会因色度子采样而遭受质量损失 我通过恢复到旧的 JAI 库并明确将水平和垂直子采样设置为 1 成功解决了这个问题 然而
  • 尝试通过 SMTP 发送邮件。没有邮件到达并且没有异常错误

    问题 制作了一个小型邮件程序 该程序在我的开发人员电脑上完美运行 但在投入生产时却失败了 protected void Page Load object sender EventArgs e string smtpHost Configur
  • ComponentDidMount() 中 Axios 请求的 Jest/Enzyme 单元测试

    我正在尝试使用 Jest 和 Enzyme 对现有的 React 应用程序执行一些单元测试 我对这些东西完全陌生 准确地说 我不知道如何处理此类测试场景 我知道要测试 API 请求调用 我必须执行一些 模拟 但我应该如何为此编写测试 需要遵
  • 在 Android 中滚动屏幕时,列表视图中的切换按钮会失去状态

    我有一个列表视图 其中每个数据都是从列表适配器获取的 列表视图中的每个项目都包含一个文本视图和切换按钮 但是当我滚动列表时出现问题 切换按钮的选中状态会发生变化 即如果我选择了索引 4 处的切换按钮 那么滚动后我发现除了第四个按钮之外的任何
  • css - 缩小父级 div 以适合一个子级的宽度并限制另一个子级的宽度[重复]

    这个问题在这里已经有答案了 假设一个父 div 有两个子 div 一个包含文本 另一个包含已知 但可变 宽度和高度的图像 我想 第一个子 包含图像 div 的宽度缩小以适应图像的宽度 我可以这样做 父 div 未指定宽度 缩小以适应包含图像
  • 如何使用 Go 编程语言从 PEM 文件读取的 RSA 私钥进行加密?

    如何在 go 中执行与以下 C 代码等效的操作 RSA key PEM read RSAPrivateKey f NULL NULL NULL std vector
  • C# - 使用 Linq 选择 XML 后代

    我有以下 XML 结构
  • 如何将异步操作与 .NET 4 中的任务并行库链接起来?

    我正在尝试以编程方式链接 C 4 中的异步操作 例如写入给定的 Stream 对象 我最初是 手动 完成此操作 将回调从一个操作挂钩到下一个操作 但我想我应该尝试使用 NET 4 任务并行库来省去重新发明并发轮的麻烦 首先 我将异步调用包装
  • 使用正则表达式分割不同长度的字符串

    我不知道使用正则表达式是否可以实现这一点 我只是问一下是否有人知道答案 我有一个string hellohowareyou 我需要像这样分割它 h el loh owar eyou 分割完成后 第一个字符串的长度为 1 第二个字符串的长度为
  • ios6 uilabel 文本未居中对齐

    我正在开发一个最低版本为 ios 5 的 ios 应用程序 我刚刚遇到了 uilabels 的一个奇怪问题 或者也许我错过了一些明显的东西 不管怎样 我遇到的问题是我有一个 uilabel 它的文本要居中对齐 在 ios 5 上一切正常 但
  • 使用 Cloudformation 的 AWS Api Gateway 代理资源?

    我正在尝试从 API 网关端点代理配置为网站的 S3 存储桶 我使用控制台成功配置了端点 但无法使用 Cloudformation 重新创建配置 经过大量的试验 错误和猜测 我想出了以下 CF 堆栈模板 它让我非常接近 Resources