【AWS】 LambdaでRoute53にAレコードを登録する。

# はじめに
👋こんにちは！Web系の企業に勤務し、地方からフルリモート勤務をしている@takakouと申します🏙️✨

今回は、「**Lamdaを用いて、Route53にAレコードを登録する**」というテーマで記事をシェアします！📝

この記事を執筆しようと思った経緯としては、私自身が **Lamda**を用いて**Aレコード**を**Route53**に登録することについて言及しているリファレンスが少ないと思ったからです。💡

そこで、同じ疑問を持つ方の解消ができればと思い執筆しました🌟

正直、自分のメモのようなものなのでかなり見づらいと思いますが、ご了承いただけますと幸いです🙏

記事執筆は未熟者で、至らない点もあるかと思いますが、皆さんのコメントやフィードバックをお待ちしています！🚀💬
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [対象者 👨](#1-対象者)
1. [動作環境 🖥️](#2-動作環境)
1. [前提条件 🗒](#3-前提条件)
1. [導入手順 🚀](#4-導入手順)
1. [参考文献 📚](#5-参考文献)
1. [おわりに 🎉](#6-おわりに)
<!-- 各チャプター -->

# 1. 対象者

* **Lamda**を使用したことがある方
* **Route53**を使用したことがある方。
* **Lamda**を用いて**Route53**にAレコードを登録したい方

:::note info
**本記事について**
下記のように取得してあるドメインにAレコードを登録していきます。
用途としては、**IPアドレスを固定にできない時**などです。
* (例)**127-0-0-1.example.com**
* (例)**127-0-0-2.example.com**

:::
# 2. 動作環境

- **AWS Console**に入れれば問題ないです。

# 3. 前提条件

- **Route53**でドメインを取得してあること。

# 4. 導入手順

## Lamdaを作成する
- あまり経験がない方は公式リファレンス等参照いただけると良いと思います。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started.html

:::note warn
**注意点**
`index.mjs`->`index.js`に変更しておいて下さい
:::

### Roleについて
- **Lamda**にアタッチする`Role`には`AmazonRoute53FullAccess`のポリシーを付与しておいて下さい。付与されていないと**Aレコードを作成する権限**がなく、エラーになります。

### Lamdaの処理
```js
const { Route53Client, ChangeResourceRecordSetsCommand } = require("@aws-sdk/client-route-53"); 

exports.handler = async function (event, context) {
    // Route53への接続
    const route53 = new Route53Client();

    // 変更を行うドメイン名とhostedzoneIDを入力
    const hostedZoneId = '********';
    const recordName = 'example.com';
    
    // IPアドレスを取得
    const newIpAddress = event.body.address;

    //レコード名を作成('.'->'-'へ正規化した上で結合)
    const newRecordName=newIpAddress.replace(/\./g, '-')+'.'+recordName

    // Aレコードの変更リクエストを作成
    const changeBatch = {
        Changes: [
            {
                Action: 'UPSERT',
                ResourceRecordSet: {
                    Name: newRecordName,
                    Type: 'A',
                    TTL: 300,
                    ResourceRecords: [
                        { Value: newIpAddress }
                    ]
                }
            }
        ]
    };
    
    // レコードの変更を実行
    try {
        const command = new ChangeResourceRecordSetsCommand({
            HostedZoneId: hostedZoneId,
            ChangeBatch: changeBatch
        });

        const response = await route53.send(command);

        console.log(response);
        
        return {
            statusCode: 200,
            body: JSON.stringify(response)
        };
    } catch (error) {
        console.error(error);
        
        return {
            statusCode: 500,
            body: JSON.stringify(error.message)
        };
    }
};

```

## testを実行する。
- 今回は、送られてきたIPアドレスの`.`->`-`に変換した文字列を、ドメインの頭につける形で**Aレコード**を登録します。
- 下記のjsonでテストを行います。
```json
{
  "body": {
    "address": "127.0.0.1"
  }
}
```

## 実行結果の確認

- **Route53**で自分が選択した**ホストゾーン(exaple.com)** に **Aレコード**が下記のように登録されていたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524017/aa3646ba-f6fb-725f-af3f-f991375a7a15.png)




# 5. 参考文献

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/getting-started.html

https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/route-53/command/ChangeResourceRecordSetsCommand/

<a id="#end"></a>
# 6. おわりに

今回の記事では、 **LamdaでRoute53にAレコードを登録** してみたい時に、Lamdaにどんな処理を書けばいいのか記述をしました。

今回の内容を応用すれば、**IPアドレスの変更等を検知した場合**や、**EC2の起動を検知した場合**などに、**Aレコードを新しく登録**もしくは**更新する**などもできると思います。


もし興味を持っていただけましたら、ぜひ他の記事も読んでいただけるとうれしいです！ 📖🌟

(最後に、気づいた方もいらっしゃると思うのですが、絵文字を入れるのは苦手なので、文章に沿った絵文字を挿入するのに、ChatGPTを利用させていただきましたが、いかがでしたでしょうか。不快に思われた方がいたら申し訳ございません 🙇‍♂️)