route53のupsertをAWS CLIから使ってみる

aws_logoaws の DNS サービス route53 の UPSERT 機能を使ってみる。

シナリオ

  • MX レコードを一つだけ追加
  • MX レコードをもう一つ追加

というような操作をする時、マネージメントコンソールから操作すれば、特に何も考えることなくテキストエリアに複数レコードを記入するだけで済む。
Web API でこの操作をするとき、昔は CREATE/DELETE の操作しかできなかったため、一度レコードを削除し、新規作成をやり直さなければいけなかった。
2014年1月から UPSERT(存在しなければCREATE、存在すれば UPDATE) にも対応したため、削除せずに UPDATE 操作できるようになった。
この UPSERT 操作を AWS CLI から触ってみる

MXレコードの追加

MX レコードがなにもない状態で1つだけMXレコードを追加

$ cat mx1.json
{
  "Comment": "Adding a new MX record for the zone.",
  "Changes": [
    {
    "Action": "CREATE",
    "ResourceRecordSet": {
        "Name": "example.com.",
        "Type": "MX",
        "TTL": 300,
        "ResourceRecords": [
            {
                "Value": "10 mail1.example.com."
            }
        ]
      }
    }
  ]
}
$ aws route53 change-resource-record-sets --hosted-zone-id XXX --change-batch file://mx1.json
{
    "ChangeInfo": {
        "Status": "PENDING",
        "Comment": "Adding a new MX record for the zone.",
        "SubmittedAt": "2014-06-02T15:30:23.145Z",
        "Id": "/change/YYY"
    }
}

$ aws route53 list-resource-record-sets  --hosted-zone-id XXX
{
    "ResourceRecordSets": [
        {
            "ResourceRecords": [
                {
                    "Value": "10 mail1.example.com."
                }
            ],
            "Type": "MX",
            "Name": "example.com.",
            "TTL": 300
        },
        ...
    ]
}

MXレコードの追加

新規レコード "20 mail2.example.com." も追加する。

失敗:キー重複したCREATEを実行

何も考えずに “Action”: “CREATE” のデータを食わせてみる

$ cat mx2_create.json
{
  "Comment": "Modifying existing MX record for the zone.",
  "Changes": [
    {
    "Action": "CREATE",
    "ResourceRecordSet": {
        "Name": "example.com.",
        "Type": "MX",
        "TTL": 300,
        "ResourceRecords": [
            {
                "Value": "10 mail1.example.com."
            },
            {
                "Value": "20 mail2.example.com."
            }
        ]
      }
    }
  ]
}

$ aws route53 change-resource-record-sets --hosted-zone-id  XXX --change-batch file://mx2_create.json

A client error (InvalidChangeBatch) occurred when calling the ChangeResourceRecordSets operation: Tried to create resource record set [name='example.com.', type='MX'] but it already exists

[name=’example.com.’, type=’MX’] のキーが重複しているため、エラーとなる。

失敗:部分 UPSERT

新しいレコードだけを ResourceRecords に指定して UPSERT を実行

$ cat mx2_partial.json
{
  "Comment": "Modifying existing MX record for the zone.",
  "Changes": [
    {
    "Action": "UPSERT",
    "ResourceRecordSet": {
        "Name": "example.com.",
        "Type": "MX",
        "TTL": 300,
        "ResourceRecords": [
            {
                "Value": "20 mail2.example.com."
            }
        ]
      }
    }
  ]
}
$ aws route53 change-resource-record-sets --hosted-zone-id XXX --change-batch file://mx2_partial.json
{
    "ChangeInfo": {
        "Status": "PENDING",
        "Comment": "Modifying existing MX record for the zone.",
        "SubmittedAt": "2014-06-02T15:35:32.944Z",
        "Id": "/change/YYY"
    }
}
$ aws route53 list-resource-record-sets  --hosted-zone-id XXX
{
    "ResourceRecordSets": [
        {
            "ResourceRecords": [
                {
                    "Value": "20 mail2.example.com."
                }
            ],
            "Type": "MX",
            "Name": "example.com.",
            "TTL": 300
        },
    ...
    ]
}

新しいレコードは追加されたが、既存の MX レコードが削除されてしまっている。

成功:UPSERT

新・旧の両方のレコードを “ResourceRecords” に指定して UPSERT を実行

$ cat mx2_upsert.json
{
  "Comment": "Modifying existing MX record for the zone.",
  "Changes": [
    {
    "Action": "UPSERT",
    "ResourceRecordSet": {
        "Name": "example.com.",
        "Type": "MX",
        "TTL": 300,
        "ResourceRecords": [
            {
                "Value": "10 mail1.example.com."
            },
            {
                "Value": "20 mail2.example.com."
            }
        ]
      }
    }
  ]
}

$ aws route53 change-resource-record-sets --hosted-zone-id XXX --change-batch file://mx2_upsert.json
{
    "ChangeInfo": {
        "Status": "PENDING",
        "Comment": "Modifying existing MX record for the zone.",
        "SubmittedAt": "2014-06-02T15:36:30.497Z",
        "Id": "/change/YYY"
    }
}

$ aws route53 list-resource-record-sets  --hosted-zone-id XXX
{
    "ResourceRecordSets": [
        {
            "ResourceRecords": [
                {
                    "Value": "10 mail1.example.com."
                },
                {
                    "Value": "20 mail2.example.com."
                }
            ],
            "Type": "MX",
            "Name": "example.com.",
            "TTL": 300
        },
        ...
    ]
}

期待通り、新旧の両方のデータが ResourceRecords に含まれている。

UPSERT 実行前に該当レコードを削除("Action": "DELETE")すると、UPSERT は CREATE として扱われるので、出力結果は上とおなじになる。

References

Advertisements
Tagged with: , ,
Posted in aws

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: