Làm cách nào để thiết lập Tuyến 53 để trỏ đến Api Gateway


12

Tôi đang viết một tập tin cấu hình Cloudform để tạo một trang web tất cả trong một lần. Điều này bao gồm, tạo các hàm lambda, tạo Cổng API, Thiết lập Nhóm S3, Tạo vùng và bản ghi Tuyến đường 53.

Cho đến nay:

  • Tạo các hàm Lambda và vai trò của nó (hoạt động)
  • Tạo API Gateway, đó là triển khai và vai trò của nó (hoạt động)
  • Tạo một thùng S3 và chính sách của nó (hoạt động)
  • Tạo một bản ghi Tuyến đường 53 và DNS cho trang web (hoạt động)
  • Tạo một tên miền cho API Gateway (không biết tôi đang làm gì)

Vì vậy, domain.comphục vụ các tệp trong nhóm S3 mà không gặp vấn đề gì. Sử dụng AWS URI cho API Gateway hoạt động https://trydsoonjc.execute-api.us-west-2.amazonaws.com/app/path/heremà không gặp vấn đề gì.

Những gì tôi muốn thiết lập là api.domain.comđể trỏ đến Cổng API để truy cập API của máy chủ.

Làm cách nào để kết nối Tuyến 53 với API Gateway?

Đám mây của tôi như hiện tại là thế này:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description" : "Website",

  "Parameters": {
    "DomainName": {
      "Type" : "String",
      "Description" : "The DNS name of an Amazon Route 53 hosted zone e.g. server.com",
      "AllowedPattern" : "(?!-)[a-zA-Z0-9-.]{1,63}(?<!-)",
      "ConstraintDescription" : "must be a valid DNS zone name."
    }
  },

  "Mappings" : {
    "RegionMap" : {
      "us-east-1" : { "S3HostedZoneId" : "Z3AQBSTGFYJSTF", "S3WebsiteEndpoint" : "s3-website-us-east-1.amazonaws.com" },
      "us-west-1" : { "S3HostedZoneId" : "Z2F56UZL2M1ACD", "S3WebsiteEndpoint" : "s3-website-us-west-1.amazonaws.com" },
      "us-west-2" : { "S3HostedZoneId" : "Z3BJ6K6RIION7M", "S3WebsiteEndpoint" : "s3-website-us-west-2.amazonaws.com" },
      "eu-west-1" : { "S3HostedZoneId" : "Z1BKCTXD74EZPE", "S3WebsiteEndpoint" : "s3-website-eu-west-1.amazonaws.com" },
      "ap-southeast-1" : { "S3HostedZoneId" : "Z3O0J2DXBE1FTB", "S3WebsiteEndpoint" : "s3-website-ap-southeast-1.amazonaws.com" },
      "ap-southeast-2" : { "S3HostedZoneId" : "Z1WCIGYICN2BYD", "S3WebsiteEndpoint" : "s3-website-ap-southeast-2.amazonaws.com" },
      "ap-northeast-1" : { "S3HostedZoneId" : "Z2M4EHUR26P7ZW", "S3WebsiteEndpoint" : "s3-website-ap-northeast-1.amazonaws.com" },
      "sa-east-1" : { "S3HostedZoneId" : "Z31GFT0UA1I2HV", "S3WebsiteEndpoint" : "s3-website-sa-east-1.amazonaws.com" }
    }
  },

  "Resources": {
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": {
              "Service": "lambda.amazonaws.com"
            },
            "Action": [ "sts:AssumeRole" ]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "execution",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
              ],
              "Resource": "*"
            }, {
              "Effect": "Allow",
              "Action": [
                "dynamodb:BatchGetItem",
                "dynamodb:CreateTable",
                "dynamodb:DeleteItem",
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:PutItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:UpdateItem",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
              ],
              "Resource": "*"
            }]
          }
        }]
      }
    },

    "APIGatewayExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": {
              "Service": "apigateway.amazonaws.com"
            },
            "Action": [ "sts:AssumeRole" ]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "execution",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
              ],
              "Resource": "*"
            }, {
              "Effect": "Allow",
              "Action": [
                "lambda:InvokeFunction"
              ],
              "Resource": "*"
            }]
          }
        }]
      }
    },

    "LambdaFunctionUpdate": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Code": {
          "ZipFile": "exports.handler = function (event, context) { context.succeed(\"Hello, World!\"); };"
        },
        "Description": "Update handler.",
        "Handler": "index.handler",
        "MemorySize": 128,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn" ] },
        "Runtime": "nodejs4.3",
        "Timeout": 30
      }
    },

    "APIGateway": {
      "Type": "AWS::ApiGateway::RestApi",
      "Properties": {
        "Body": @@swagger,
        "FailOnWarnings": true,
        "Name": "smallPictures",
        "Description": "Structured wiki"
      }
    },

    "APITDeploymentTest": {
      "Type": "AWS::ApiGateway::Deployment",
      "Properties": {
        "RestApiId": { "Ref": "APIGateway" },
        "Description": "Deploy for testing",
        "StageName": "smallPicturesTesting"
      }
    },

    "WebsiteBucket" : {
      "Type" : "AWS::S3::Bucket",
      "Properties" : {
        "BucketName": {"Ref":"DomainName"},
        "AccessControl" : "PublicRead",
        "WebsiteConfiguration" : {
          "IndexDocument" : "index.html",
          "ErrorDocument" : "404.html"
        }
      },
      "DeletionPolicy" : "Retain"
    },

    "WebsiteBucketPolicy" : {
      "Type" : "AWS::S3::BucketPolicy",
      "Properties" : {
        "Bucket" : {"Ref" : "WebsiteBucket"},
        "PolicyDocument": {
          "Statement": [{
              "Action": [ "s3:GetObject" ],
              "Effect": "Allow",
              "Resource": { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "WebsiteBucket" } , "/*" ]]},
              "Principal": "*"
          }]
        }
      }
    },

    "DNS": {
      "Type": "AWS::Route53::HostedZone",
      "Properties": {
        "HostedZoneConfig": {
          "Comment": { "Fn::Join" : ["", ["Hosted zone for ", { "Ref" : "DomainName" } ]]}
        },
        "Name": { "Ref" : "DomainName" },
        "HostedZoneTags" : [{
          "Key": "Application",
          "Value": "Blog"
        }]
      }
    },

    "DNSRecord": {
      "Type": "AWS::Route53::RecordSetGroup",
      "Properties": {
        "HostedZoneName": {
            "Fn::Join": [ "", [ { "Ref": "DomainName" }, "." ]]
        },
        "Comment": "Zone records.",
        "RecordSets": [
          {
            "Name": { "Ref": "DomainName" },
            "Type": "A",
            "AliasTarget": {
              "HostedZoneId": { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "S3HostedZoneId" ]},
              "DNSName": { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "S3WebsiteEndpoint" ]}
            }
          }, {
            "Name": { "Fn::Join" : ["", ["www.", { "Ref" : "DomainName" }]]},
            "Type": "CNAME",
            "TTL" : "900",
            "ResourceRecords" : [
              {"Fn::GetAtt":["WebsiteBucket", "DomainName"]}
            ]
          }
        ]
      }
    }
  },

  "Outputs": {
    "WebsiteURL": {
      "Value": { "Fn::GetAtt": ["WebsiteBucket", "WebsiteURL" ] },
      "Description": "URL for website hosted on S3"
    }
  }
}

4
Tên miền tùy chỉnh (tên máy chủ) không được trỏ trực tiếp vào điểm cuối API Gateway. Nó chỉ vào bản phân phối CloudFront cơ bản, được tạo / sở hữu / kiểm soát bởi API Gateway sau khi API Gateway được định cấu hình để mong đợi / hỗ trợ tên miền tùy chỉnh. Điều này phức tạp hơn đơn giản là tạo một bản ghi trong Tuyến 53. Bạn sẽ cần xem lại Sử dụng Tên miền tùy chỉnh làm Tên máy chủ API API trừ khi bạn đã quen với quy trình này.
Michael - sqlbot

2
Bạn cũng cần cung cấp chứng chỉ SSL cho tên máy chủ tùy chỉnh của mình hoặc lấy chứng chỉ từ Trình quản lý chứng chỉ Amazon, như một phần của cấu hình, vì API Gateway yêu cầu HTTPS phải được bật.
Michael - sqlbot

Câu trả lời:


4

Bạn phải tạo chứng chỉ SSL bằng Trình quản lý chứng chỉ. Đối với điểm cuối cạnh, hãy tạo điểm cuối trong eu-East-1, đối với điểm cuối khu vực và riêng tư, hãy tạo điểm cuối trong khu vực bạn đang triển khai cổng API trong (hoặc lambda). Đọc thêm ở đây . Tôi sẽ đề cập đến ARN nhưCertificateArn

Bạn phải cấu hình một AWS::ApiGateway::DomainName:

"MyDomainName": {
  "Type": "AWS::ApiGateway::DomainName",
  "Properties": {
    "DomainName": {"Ref: "DomainName"},
    "CertificateArn": "arn:aws:acm:us-east-1:111122223333:certificate/fb1b9770-a305-495d-aefb-27e5e101ff3"
  }
}

Điều này cho phép Miền cho Cổng API. Tiếp theo, bạn cần trưng ra API (tức là RestAPI của bạn), trong một giai đoạn triển khai cụ thể . Trong mẫu của bạn, bạn không có giai đoạn triển khai. Hãy xem a AWS::ApiGateway::Stage. Một ví dụ tối thiểu sẽ trông như thế này:

"Prod": {
            "Type": "AWS::ApiGateway::Stage",
            "Properties": {
                "StageName": "Prod",
                "Description": "Prod Stage",
                "RestApiId": {
                    "Ref": "APIGateway"
                },
                "DeploymentId": {
                    "Ref": "APITDeploymentTest"
                },
}

Tuy nhiên, rất có thể bạn muốn một số cấu hình bổ sung trong đó. Tôi đề nghị bạn hãy xem MethodSettingstài sản.

Cuối cùng, triển khai một tài nguyên ánh xạ cơ sở : AWS::ApiGateway::BasePathMapping. Tôi đề nghị bạn ánh xạ basepath đến giai đoạn bạn tạo như thế này:

"ProdDomainBasePath": {
  "Type" : "AWS::ApiGateway::BasePathMapping",
  "Properties" : {
    "DomainName" : {"Ref: "DomainName"},
    "RestApiId" : {"Ref": "APIGateway"},
    "Stage" : "Prod"
  }
}

Nếu bạn thay đổi AWS::ApiGateway::Stagetài nguyên, bạn phải buộc cập nhật AWS::ApiGateway::Deploymenttài nguyên tương ứng - điều này thường có nghĩa là đổi tên AWS::ApiGateway::Deploymenttài nguyên, để ghi nhớ điều đó. Nếu không, nó sẽ không được triển khai.

Nên làm vậy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.