使用树莓派(Debian系统)来更新Route53
总结
由于各种情况,我决定在家里的树莓派(Debian)上直接进行PPPoE连接。
因此,我必须自己更新用于外部访问的DNS记录。
DNS使用Route53,可通过aws CLI轻松更新,所以我决定将Route53用作DDNS。
重点/目标
-
- 技術的に難しい/新しいことは何もなく、有りものの組み合わせで実現しているが、有りもの全体をまとめた記事がなかったので残しておく。
- 昔はDDNS関係の記事がいっぱいあった気がするが、今は自宅にサーバを置くような時代じゃないようで、近年の記事がない。なので近況更新のような位置づけで記事を残す。
军事行动
-
- 前述の通り、Route53はaws CLIで更新できる。なのでPPPoE接続時にaws CLIを実行する。
- 具体的には、PPPoE接続時に実行される/etc/ppp/ip-up.local(シェルスクリプト)でaws CLIを実行する。
步骤
安装 AWS CLI
虽然与文章的主题无直接关系,但是有很多旧的文章在使用pip来安装awscli,但我不太喜欢这样做,因为它经常会破坏整个操作系统的环境。
根据aws官方文档介绍的v2版本,它似乎是一个不依赖于操作系统中的Python的二进制文件,看起来很不错。而且它还提供了针对ARM架构的版本。
但是当我实际尝试时,发现它似乎是一个预设为在运行64位ARM操作系统的二进制文件,所以无法正常运行。很可能是希望在EC2 A1实例等地方运行。(⇒参考)
因此,遗憾的是,在树莓派(Debian 32位)上,只能运行依赖于传统Python的aws CLI v1版本。至少可以通过virtualenv中的pip来安装以下的zip文件。
curl -s "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
cd ./awscli-bundle
./install -i /usr/local/aws -b /usr/local/bin/aws
稍后会完成aws CLI的设置。
新建IAM用户(策略)(可选)
在执行以上的AWS CLI操作时,需要创建一个能够更新目标记录的IAM用户(以及其策略)。
(虽然使用现有用户或具有FullAccess权限的用户在技术上没有问题,但那样做确实有些危险,所以要避免这样做)
具体操作是,在AWS控制台(IAM)中添加以下策略,并添加拥有该策略的用户。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "route53:ChangeResourceRecordSets",
"Resource": [
"arn:aws:route53:::hostedzone/xxxxxxxxxx"
]
}
]
}
您可以在AWS控制台的Route53中查找区域ID。
对于这样创建的用户,请在AWS CLI中设置配置文件。
aws configure --profile xxxxx
创建一个在PPPoE连接时执行aws CLI命令的脚本。
虽然有点唐突,但是查看/etc/ppp/ip-up文件的内容,如下所写。
#!/bin/sh
#
# 这个脚本在链接建立后由pppd运行。
# 它使用run-parts来运行/etc/ppp/ip-up.d目录中的脚本,以添加路由、设置IP地址、运行邮件队列等。所以你应该在那里创建脚本。
#
# 请注意,其他软件包可能会包含/etc/ppp/ip-up.d脚本(以该软件包命名),因此在选择本地脚本名称时要考虑这一点。
而在这个文件的中间
# 此脚本可用于覆盖其他软件包提供的.d文件。
如果[ -x /etc/ppp/ip-up.local ]; then
执行 /etc/ppp/ip-up.local “$@”
fi
由于如此,我将创建一个名为/etc/ppp/ip-up.local的shell脚本。
其内容如下所示。
#! /bin/bash
DIR="/etc/ppp"
JSON="$DIR/ip-up.json"
NEW_IP=$PPP_LOCAL
update_route53 () {
cat <<EOF > $JSON
{
"Comment": "Updated by /etc/ppp/ip-up.local",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "$1",
"Type": "A",
"TTL": 3600,
"ResourceRecords": [
{
"Value": "$NEW_IP"
}
]
}
}
]
}
EOF
/usr/local/bin/aws route53 change-resource-record-sets --hosted-zone-id $2 --change-batch file://$JSON --profile xxxxx
}
NAME="xxx.xxxxx.com"
HOSTZONE_ID="xxxxxxxxxx"
update_route53 $NAME $HOSTZONE_ID
首先创建包含获取的PPPoE IP地址的json文件,并使用它来使用aws CLI更新Route53记录。虽然json文件的位置似乎是固定的且不太美观,但暂时没有问题,就这样进行。
以上 can be paraphrased in Chinese as “前面提到的” de), which means “mentioned above” or “previously mentioned.”
后记
因为正在为打算之后写的文章做准备,所以写得内容很薄。