1

我正在使用 Zappa 部署 Flask 应用程序。它有效(网站)。显然,我不希望它停留在 aws 域后面并将其放在我的个人域中。

我正在搜索的所有内容都在谈论使用S3 和 API Gateway 托管 Lambda 站点。有没有办法将我的小应用程序部署到自定义域?

编辑

在@mislav 的回答之后,我能够让我的谷歌域与 AWS 一起工作。但是,当我尝试通过运行完成时,zappa certify我收到有关现有域的错误:

raise error_class(parsed_response, operation_name) botocore.errorfactory.BadRequestException: 调用 CreateDomainName 操作时发生错误 (BadRequestException): 您提供的域名已经存在。

zappa_settings.json的是

{
"dev": {
    "app_function": "ping_app.app",
    "aws_region": "us-west-1",
    "profile_name": "Breuds",
    "project_name": "breuds",
    "runtime": "python3.6",
    "s3_bucket": "zappa-ping-redshift",
    "slim_handler": true,
    "certificate_arn": "arn:aws:acm:us-east-1:010174774769:certificate/3a92c204-5788-42fc-bc65-74aaae8c1b3f",
    "domain": "breuds.com"
}
}

我开始认为我在我的域方面做一些令人费解的事情。我正在使用 Google Domains(因为我的电子邮件有一个自定义域,只是使用它),但这似乎会导致让 AWS 与之交谈令人头疼。

4

2 回答 2

2

它实际上在zappa 的自述文件中进行了解释。

使用 AWS Certificate Manager 部署到域

Amazon 提供了他们自己的免费替代 Let's Encrypt,称为 AWS Certificate Manager (ACM)。要将此服务与 Zappa 一起使用:

在 AWS Certificate Manager 控制台中验证您的域。在控制台中,选择 N. Virginia (us-east-1) 区域并为您的域或子域 (sub.yourdomain.tld) 申请证书,或申请通配符域 (*.yourdomain.tld)。复制该证书的整个 ARN 并将其放在 Zappa 设置 certificate_arn 中。在域设置中设置您想要的域。调用 $ zappa certify 以使用该证书创建和关联 API Gateway 分发。

还有使用现有证书等的说明。

不要让它愚弄你,这部分的标题听起来像是关于证书的,但是有关于使用你自己的域的详细说明。

编辑:我包括我自己的 zappa 设置以供参考。

{
    "common": {
        "app_function": "app.__hug_wsgi__",
        "aws_region": "eu-central-1",
        "s3_bucket": "excuse-generator",
        "profile_name": "mislavcimpersak",
        "remote_env": "s3://excuse-generator/secrets.json",
        "certificate_arn": "arn:aws:acm:us-east-1:500819636056:certificate/3edb9c1c-12c5-4601-89a9-dc42df840fa6"
    },
    "prod": {
        "extends": "common",
        "domain": "function.xkcd-excuse.com"
    },
    "dev": {
        "extends": "common",
        "debug": true,
        "keep_warm": false,
        "domain": "function-dev.xkcd-excuse.com"
        }
    }

在 namecheap.com 上购买并通过 cloudflare.com 提供服务的域名的分步指南

  1. 在 namecheap.com 上购买域名/使用现有的
  2. 在 cloudflare.com/use existing 上注册新站点
  3. cloudflare 会给你(很可能)两个域名服务器
  4. 在https://ap.www.namecheap.com/domains/domaincontrolpanel/xkcd-excuse.com/domain DNS下输入- 选择 cloudflare 上提供的“自定义 DNS”名称服务器
  5. 转到 AWS ACM 并申请新证书(证书必须在us-east-1区域创建)
  6. 如有必要,输入多个子域 ( foo.example.com& foo-dev.example.com)
  7. 记下 AWS 管理控制台提供的 ACM ARN
  8. 在您的 ARNzappa_settings.json下输入certificate_arn
  9. in zappa_settings.jsonunder route53_enabledput false-这是必须的
  10. 在每个阶段的输入域zappa_settings.json下,即。和domainfoo.example.comfoo-dev.example.com
  11. zappa certify <stage_name>
  12. 它应该说:“使用提供的证书创建了一个新域名。请注意,通过 AWS 创建和传播此域最多可能需要 40 分钟,但您无需进一步工作。证书已更新!”
  13. 进入 CloudFlare DNS 界面并输入
    • CNAME: foo - i3jtsjkdeu4wxo.cloudfront.net
    • CNAME: foo-dev - d2jtsjkdeu4wxo.cloudfront.net
  14. 等待 40 分钟并检查您的域,它们应该为您的 Lambda 函数提供服务
于 2017-12-02T12:34:07.763 回答
1

您可能不需要 API 网关。这将取决于网站功能。您可以使用具有自定义域的 S3 托管静态网站。您可以包含客户端 javascript(angular/react 等)。API Gateway 真正用于处理 http 请求并将其传递给定义的资源(Lambda 或其他)。

如果您的站点需要后端功能,那么您几乎没有选择。
1) 构建 lambda 函数,然后使用 API Gateway(REST API) 与这些函数进行交互。
yourhostname.com -> S3 -> API Gateway(aws 主机名) -> lambda

2) 使用 AWS JS SDK 直接与您的 lambda 函数进行交互。
yourhostname.com -> S3 -> AWS 开发工具包 -> lambda

3) 使用 API Gateway,然后使用 EC2 实例
yourhostname.com -> API Gateway(aws hostname) -> lambda
yourhostname.com -> 自托管 Web 服务器转发到 Lambda 或自托管 Web 服务器(flask 节点)

这是一张可能会使它更清晰的图片。 在此处输入图像描述

如果我错了,请纠正我烧瓶用于后端开发以构建微服务。要托管它,您可以使用构建 lambda 函数或将其托管在您自己的实例上。 https://andrich.blog/2017/02/12/first-steps-with-aws-lambda-zappa-flask-and-python/

让我知道这是否有帮助。

于 2017-12-02T05:13:25.320 回答