【问题标题】:Programmatically setting up a static website using Amazon S3 and Route 53 APIs使用 Amazon S3 和 Route 53 API 以编程方式设置静态网站
【发布时间】:2013-12-09 14:17:26
【问题描述】:

假设我已经购买了一个 IP 地址为 203.0.113.2 的域 example.com。使用 C# 和适用于 .NET 2.0.2.2 的 Amazon Web Services SDK,我想使用 Amazon S3 和 Route 53 的自定义域创建一个静态网站。手动过程在 Amazon documentation 中进行了描述。

尝试创建别名时,我收到一条异常消息:

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.

首先,我在 Amazon S3 中创建或更新了一个存储桶(例如“example.com”)。如果已存在,则删除内容。

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 托管站点。

然后我使用 Route 53 API 更新现有托管区域或为“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);
}

托管区域 ID ("Z2F56UZL2M1ACD") 和 DNS 名称 ("s3-website-us-west-1.amazonaws.com.") 是公共知识和 documented on Amazon's website

对 ChangeResourceRecordSets 的调用会引发异常。我创建了一个空的 ResourceRecords 列表,A 记录为“203.0.113.2”,但没有任何运气创建别名。

也就是说,之后我可以使用“Route 53 管理控制台”手动创建 Amazon S3 站点的别名。我确定这是我缺少的一些小东西。

【问题讨论】:

    标签: c# amazon-web-services amazon-s3 amazon-route53


    【解决方案1】:

    重新阅读文档后,发现指定别名时无法指定 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 中指定的请求进行比较时,差异很明显。

    【讨论】:

      猜你喜欢
      • 2012-07-27
      • 2012-11-07
      • 2012-10-01
      • 2013-08-06
      • 2019-12-15
      • 2021-05-14
      • 2012-01-01
      • 2019-12-22
      • 2018-02-09
      相关资源
      最近更新 更多