【问题标题】:Hosting a Angular 6 app in AWS S3 bucket with proxy使用代理在 AWS S3 存储桶中托管 Angular 6 应用程序
【发布时间】:2019-08-11 19:26:23
【问题描述】:

我有一个 Angular 应用程序,它从不同的服务器 (CORS) 调用 API 我已经设置了代理来这样做。

当我运行 npm start 时,它将运行 ng serve --port 80 --proxy-config proxy.conf.json

我的package.json 文件如下

{
  "name": "appname",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve --port 80 --proxy-config proxy.conf.json",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    -- dependencies --
  },
  "devDependencies": {
    -- devDependencies --
  }
}

proxy.config.json 文件包含API 端点配置,如下所示。

{
    "/api":{
        "target": "http://url_to_my_api_server",
        "secure": false,
        "changeOrigin": true
    }
}

我已将项目上传到 AWS EC2 (Ubuntu, Node 10.9.0, NPM 6.4.0) 实例并按照 THIS 教程使用 serverless 部署它。它创建了一个S3 存储桶,我可以访问前端。 HTML,CSSJavaScript 正在正确加载,但图像不是。如果我打开图像显示Forbidden 403 错误。

以下是我的S3 Bucket 政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::s3-bucket-name/*"
            ]
        }
    ]
}

另一个问题是API 我使用Proxy 执行的请求也显示相同的错误。

如何在S3 存储桶上正确托管网站并使用Proxy 进行API 调用(我不想向用户透露API 端点)。

还有其他方式来托管网站吗?

【问题讨论】:

  • 您的资产文件夹在您的 S3 存储桶的根路径上的什么位置?您是否将存储桶规则编辑为公开阅读,也适用于资产文件夹和文件?
  • 请检查更新后的问题,我已经使用S3 Bucket 策略更新了问题,我没有检查资产,因为它是由serverless 自动部署的。我的存储桶中有很多嵌套文件夹。

标签: node.js angular amazon-s3 amazon-ec2 serverless-framework


【解决方案1】:

注意:S3 存储桶为您提供静态网络托管选项

  1. 您需要为您的项目设置 WEBPACK 以进行最终构建,因为它不会在 s3 上运行您的 npm start 脚本
  2. 所以使用 webpack 构建您的项目。
  3. 它将捆绑您的项目,并为您提供 3-4 个 js 文件和一个可以部署在 s3 上的 html 文件
  4. 在 s# 属性中有一个静态网络托管选项 - 配置它以提供您的登陆 index.html 文件
  5. 你就完成了

【讨论】:

  • 它支持那个代理文件吗? proxy.config.json 是一个外部文件,所有代理设置都保存在这里!
  • 您好,我已经尝试过了,但现在我收到了MethodNotAllowed 错误。我是否需要设置CloudFrontLabda 才能拨打API?如果是,那么我的服务托管在不同的服务器上,我为什么要设置网关来做到这一点?
  • @harshil,你的答案缺少一个关键部分,如果它们不在同一个域上,前端将无法向后端发出请求,因此在开发中他使用代理,但是他正在将他的应用程序部署到 aws s3 的生产环境中寻找解决方案。直到今天我才知道这个问题,但你完全忽略了 OP 面临的错误。
  • @rakcode 我开始意识到在 s3 上托管 angular 并不像看起来那么简单,为了解决 angular 中的路由问题,我不得不将来源指定为我的 S3 网站 DNS只是选择实例,这可能会让你失去缓存的好处!所以无论如何我找到了几个解决方案,我还没有尝试过,但你可以检查一下,以防有人遇到这个问题stackoverflow.com/a/48921029/315625stackoverflow.com/a/60274017/315625
猜你喜欢
  • 2020-07-24
  • 2021-10-07
  • 2017-10-25
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 2018-02-01
  • 2021-05-27
  • 2018-05-22
相关资源
最近更新 更多