【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.

谷中

システム開発チームと検証チームのマネージャー。 「疎結合 小さなクラス 分業制」 を裏スローガンとし、これが実現できてこそ、幸せな開発者人生を過ごせるという確信のもと、上流から設計まで口を挟んだり挟まなかったりしています。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>