【AWS SDK for .NET】でRoute53のホストゾーンにレコードを追加する

.NETのAWSのSDK経由でRoute53にレコードを追加する方法を解説します。
使用言語はC#です。

AWSの管理コンソールにアクセスして“手作業”でやっても問題ないのかもしれませんが、

  • EC2インスタンスをたちあげて
  • EBSボリュームを起動して
  • それらをアタッチして
  • Route53にサブドメインを割り立てる

というアプリケーションを作って、簡単に「オンデマンドASPサービス」の展開をしたいと思う人はいるのではないでしょうか?

EC2やEBSについてはそれなりにサンプルが見つかったのですが、Route53についてはほとんど見つからないようです。

では、早速始めましょう。

1.アクセスキーを確認する。
AWSの管理コンソールにログインします。
「Account > Security Credentials」に移動します。

「アクセスキーID」= &&&&&&&&&&&&&&&&&&&&&&&
「シークレットアクセスキー」= ??????????????????????????????
をメモしておきます。

2.Hosted Zoneを作成する。
AWSの管理コンソールで、Route53サービスに移動します。
「Create Hosted Zone」をクリックし、お手元のドメインを登録します。
(ドメインの取得方法、Name Serverの登録方法などは、今回の記事の範疇外とします。)

「Domain Name」= ********.***
「Hosted Zone ID」= ##################
をメモしておきます。

3.(コードを書き始めます)SDKをimportします。

using Amazon;
using Amazon.Route53;
using Amazon.Route53.Model;


SDKの入手やインストールは、AWSのサイトで確認してください。

4.接続情報等は、別にして設定しておいた方が楽です。

public static class CConstant
{
    public static string AWSAccessKey = "&&&&&&&&&&&&&&&&&&&&&&&";
    public static string AWSSecretKey = "??????????????????????????????";

    public static string HostedZoneId = "##################";
    public static string Domain = "********.***";
    
    public static long TTL = (TTL値:負荷を考える必要があるが、可能な範囲で低い値にしておく);
    public static string Identifier = "(なんでもOK)";
}

5.本体

public class LibAWSRoute
{
    public void ChangeDNSRecordSet(string subdomain, string ip)
    {
        AmazonRoute53 dns = AWSClientFactory.CreateAmazonRoute53Client(CConstant.AWSAccessKey, CConstant.AWSSecretKey);
               
        // Change条件
        ResourceRecord resourceRecord = new ResourceRecord();
            resourceRecord.Value = ip;

        ResourceRecordSet recordSet = new ResourceRecordSet();
            recordSet.Name = subdomain + "." + CConstant.Domain;
            recordSet.SetIdentifier = CConstant.Identifier;
            recordSet.Type = "A";
            recordSet.TTL = CConstant.TTL;
            recordSet.Weight = 10;
            recordSet.ResourceRecords = new List() { resourceRecord };

        Change change = new Change();
            change.Action = "CREATE";
            change.ResourceRecordSet = recordSet;

        ChangeBatch changeBatch = new ChangeBatch();
            changeBatch.Comment = "add my instance";
            changeBatch.Changes = new List() { change };

        ChangeResourceRecordSetsRequest request = new ChangeResourceRecordSetsRequest();
            request.ChangeBatch = changeBatch;
            request.HostedZoneId = CConstant.HostedZoneId;

        // Change実行
        ChangeResourceRecordSetsResponse response = dns.ChangeResourceRecordSets(request);
        
        return;
    }
}

6.補足
Referenceを見ると(recordSetは上記コード内の変数)

    recordSet.Region = ほにゃらら


のように何かを指定しなければならないような気になりますが、そもそもHosted ZoneにRegionを指定していないので、これは書きません。
書くと、“そのRegion内の情報”を探しに行くので、
「Regionを指定するな」というエラーメッセージではなく、
「Regionエレメント内に不正な設定がある」というエラーメッセージが戻ってきます。

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


ハマりポイントでした。
ちなみに、「https://route53.amazonaws.com/doc/2012-02-29/」は、現在存在していませんので、何の参考にもなりません。

ついでに、

    recordSet.AliasTarget = ほにゃらら


も書きません。

なお、「レコードの削除」は

    change.Action = "DELETE";


でできます。

The following two tabs change content below.

ロゴスウェア

ロゴスウェア株式会社は、インターネットや情報技術を使って学習に革新的進化をもたらす製品を開発することを目標に、2001年7月に設立されたテクノロジー系ベンチャー企業です。

Comments are closed.