2013-11-25 1 views
1

Предположим, что я уже купил домен example.com с IP-адресом 203.0.113.2. Используя C# и SDK для веб-служб Amazon для .NET 2.0.2.2, я хотел бы создать статический веб-сайт с использованием настраиваемого домена с использованием Amazon S3 и Route 53. Ручной процесс описан в Amazon documentation.Программная настройка статического веб-сайта с использованием API-интерфейсов Amazon S3 и Route 53

При попытке создать псевдоним, я получаю исключение с сообщением:

Invalid XML ; cvc-complex-type.2.4.a: Invalid content was found starting with element 'AliasTarget'. 
One of '{"https://route53.amazonaws.com/doc/2012-12-12/":ResourceRecords}' is expected. 

Во-первых, я создал или обновил ведро (например, «example.com») в Amazon S3. Если он уже существует, содержимое удаляется.

using (var client = AWSClientFactory.CreateAmazonS3Client(RegionEndpoint.USWest1)) 
{ 
    if (!S3BucketExists(name, client)) 
    { 
     client.PutBucket(new PutBucketRequest 
     { 
      BucketName = name, 
      BucketRegion = S3Region.USW1, 
      CannedACL = S3CannedACL.PublicRead 
     }); 
    } 
    else 
    { 
     var request = new ListObjectsRequest 
     { 
      BucketName = name 
     }; 
     var objects = client.ListObjects(request).S3Objects; 
     foreach (var o in objects) 
     { 
      client.DeleteObject(new DeleteObjectRequest 
      { 
       BucketName = name, 
       Key = o.Key 
      }); 
     } 
     client.PutACL(new PutACLRequest 
     { 
      CannedACL = S3CannedACL.PublicRead, 
      BucketName = name 
     }); 
    } 

    client.PutBucketWebsite(new PutBucketWebsiteRequest 
    { 
     BucketName = name, 
     WebsiteConfiguration = new WebsiteConfiguration 
     { 
      ErrorDocument = "404.html", 
      IndexDocumentSuffix = "index.html" 
     } 
    }); 

    CreateObject(name, client, "index.html", "text/html", "<p>The site is under maintenance</p>"); 
    CreateObject(name, client, "404.html", "text/html", "<p>Not Found</p>"); 
} 

S3BucketExists возвращается, существует ли ведро или нет, и CreateObject создает простую страницу и автоматически заливает ковш. Его опущено ради краткости. Я могу подключиться к размещенному сайту S3 без каких-либо проблем.

Затем я использую API Route 53 для обновления существующей размещаемой зоны или создания ее для «example.com». Все ресурсы, за исключением записей SOA и NS, удаляются.

using (var client = AWSClientFactory.CreateAmazonRoute53Client()) 
{ 
    var hostedZone = FindHostedZoneByName(client, domainName); 
    if (hostedZone != null) 
    { 
     var resourceRecordSets = client.ListResourceRecordSets(new ListResourceRecordSetsRequest 
     { 
      HostedZoneId = hostedZone.Id, 
     }); 

     bool hasElements = false; 
     var request1 = new ChangeResourceRecordSetsRequest 
     { 
      HostedZoneId = hostedZone.Id, 
      ChangeBatch = new ChangeBatch 
      { 
       Changes = new List<Change>() 
      } 
     }; 
     foreach (var resourceRecordSet in resourceRecordSets.ResourceRecordSets) 
     { 
      switch (resourceRecordSet.Type) 
      { 
       case "SOA": 
       case "NS": 
        continue; 
      } 

      var change = new Change 
      { 
       Action = "DELETE", 
       ResourceRecordSet = resourceRecordSet 
      }; 
      request1.ChangeBatch.Changes.Add(change); 
      hasElements = true; 
     } 

     if (hasElements) 
     { 
      var response = client.ChangeResourceRecordSets(request1); 
     } 
    } 
    else 
    { 
     hostedZone = CreateHostedZone(client, domainName); 
    } 

    var hostedZoneId = hostedZone.Id; 
    var request = new ChangeResourceRecordSetsRequest 
    { 
     HostedZoneId = hostedZoneId, 
     ChangeBatch = new ChangeBatch 
     { 
      Changes = new List<Change> 
      { 
       new Change 
       { 
        Action = ChangeAction.CREATE, 
        ResourceRecordSet = new ResourceRecordSet 
        { 
         Name = GetQualifiedName(domainName), 
         Type = RRType.A, 
         TTL = 300, 
         AliasTarget = new AliasTarget() 
         { 
          HostedZoneId = "Z2F56UZL2M1ACD", 
          DNSName = "s3-website-us-west-1.amazonaws.com.", 
         }, 
        }, 
       }, 
      } 
     } 
    }; 
    client.ChangeResourceRecordSets(request); 
} 

Размещенная идентификатор зоны ("Z2F56UZL2M1ACD") и имена DNS ("s3-website-us-west-1.amazonaws.com.") Являются общедоступным знанием и documented on Amazon's website.

Призыв к ChangeResourceRecordSets вызывает исключение. Я создал пустой список ResourceRecords с записью A «203.0.113.2», но не удался создать псевдоним.

При этом я могу вручную создать псевдоним на сайте Amazon S3 после использования «Консоли управления маршрутом 53». Я уверен, что это что-то маленькое, что мне не хватает.

ответ

2

После повторной проверки документации выясняется, что при определении псевдонима нельзя указать TTL. Выполняется следующее изменение. Заменить код, который создает экземпляр ChangeResourceRecordSetsRequest к следующему:

var request = new ChangeResourceRecordSetsRequest 
{ 
    HostedZoneId = hostedZoneId, 
    ChangeBatch = new ChangeBatch 
    { 
     Changes = new List<Change> 
     { 
      new Change 
      { 
       Action = ChangeAction.CREATE, 
       ResourceRecordSet = new ResourceRecordSet 
       { 
        Name = GetQualifiedName(domainName), 
        Type = RRType.A, 
        AliasTarget = new AliasTarget 
        { 
         HostedZoneId = "Z2F56UZL2M1ACD", 
         DNSName = "s3-website-us-west-1.amazonaws.com.", 
         EvaluateTargetHealth = false, 
        }, 
       }, 
      }, 
     } 
    } 
}; 

Разница была очевидна, когда выход производства System.Net tracing сравнивали с просьбой, указанной в Amazon example.

Смежные вопросы