Route 53'ü Api Gateway'i gösterecek şekilde nasıl ayarlarım


12

Tek seferde bir web sitesi oluşturmak için bir Cloudformation yapılandırma dosyası yazıyorum. Bu, lambda işlevleri oluşturma, API Ağ Geçidi oluşturma, S3 Grubu Kurma, Route 53 bölgesi oluşturma ve kayıtları içerir.

Şimdiye kadar:

  • Lambda fonksiyonlarının oluşturulması ve rolü (çalışır)
  • Dağıtımını ve rolünü API Ağ Geçidi oluşturma (çalışıyor)
  • Bir S3 kovası oluşturma ve politikası (çalışıyor)
  • Site için Route 53 bölgesi ve DNS kayıtları oluşturma (çalışıyor)
  • API Ağ Geçidi için bir alan adı oluşturun (ne yaptığımı bilmiyorum)

Yani domain.comS3 kovasındaki dosyaları sorunsuz bir şekilde sunar. AWS URI'yi API Gateway için kullanmak https://trydsoonjc.execute-api.us-west-2.amazonaws.com/app/path/heresorunsuz çalışır .

Ne kurmak istiyorum api.domain.comsunucunun API erişmek için API Ağ Geçidi işaret etmektir.

Route 53'ü API Gateway'e nasıl bağlarım?

Bulut Bilişim şu an olduğu gibi:

{
  "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
Özel bir alan adı (ana bilgisayar adı) doğrudan API Ağ Geçidi uç noktasına işaret edilmez. API Ağ Geçidi, özel etki alanı adını beklemek / desteklemek üzere yapılandırıldıktan sonra API Ağ Geçidi tarafından oluşturulan / sahip olunan / denetlenen temel CloudFront dağıtımına işaret eder . Bu, yalnızca Rota 53'te bir kayıt oluşturmaktan daha karmaşıktır . Bu işleme aşina değilseniz Özel Alan Adı'nı API Ağ Geçidi API Ana Bilgisayar Adı olarak kullanmanız gerekir.
Michael - sqlbot

2
API Ağ Geçidi HTTPS'nin etkinleştirilmesini gerektirdiğinden, özel ana makine adınız için bir SSL sertifikası sağlamanız veya yapılandırmanın bir parçası olarak Amazon Sertifika Yöneticisi'nden bir sertifika almanız gerekir.
Michael - sqlbot

Yanıtlar:


4

Sertifika Yöneticisi'ni kullanarak bir SSL sertifikası oluşturmanız gerekir. Bir uç uç nokta için, eu-east-1'de, bölgesel ve özel uç noktalar için, API ağ geçidini (veya lambda) dağıttığınız bölgede oluşturun. Daha fazlasını buradan okuyun . ARN'ye şu şekilde değineceğim:CertificateArn

Bir yapılandırmanız gerekir 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"
  }
}

Bu, API Ağ Geçidi için Etki Alanını etkinleştirir. Ardından, API'yı (yani RestAPI'nız) belirli bir dağıtım aşamasında göstermeniz gerekir . Şablonunuzda dağıtım aşamanız yok. Bir göz atın a AWS::ApiGateway::Stage. Minimal bir örnek şöyle görünecektir:

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

Ancak, büyük olasılıkla bu konuda bazı ek yapılandırmalar istersiniz. Tesise bir göz atmanızı öneririm MethodSettings.

Sonunda, bir BasePath haritalama kaynak dağıtmak: AWS::ApiGateway::BasePathMapping. Basepatı şu şekilde oluşturduğunuz sahneye eşlemenizi öneririm:

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

Bir AWS::ApiGateway::Stagekaynağı değiştirirseniz , ilgili AWS::ApiGateway::Deploymentkaynak için bir güncellemeyi zorlamanız gerekir - bu genellikle AWS::ApiGateway::Deploymentkaynağı yeniden adlandırmak ve bunu akılda tutmak anlamına gelir . Aksi takdirde konuşlandırılmaz.

Bunu yapmalı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.