Предположим, что я уже купил домен 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». Я уверен, что это что-то маленькое, что мне не хватает.