Route53でDNS切り替え自動化の実装めも
環境切り替えは、
Route53のWeighted Roud Robin(WRR)レコードでWeighted値の変更で実現
→cli53で簡単にWRRレコード更新できないため、dnscurl.plを利用
実行環境
EC2(AmazonLinux)
AWSCLI,cli53,jq,
実装めも
①Hosted Zone作成(存在しない場合)
xxx.xxx
Hosted Zone ID:めもしておく
②2つのELBを作成
ELB名、Endpoint
③Route53でWRRレコード作成(AレコードのAlias)
Alias Target:ELBのEndpoint
Alias Hosted Zone ID:めもしておく
Set ID:env1/env2
Weighted:
ennv1 -> 255
ennv2 -> 0
切り替えスクリプトの概要:
引数で受け取る:
HOSTED_ZONE_NAME=xxx.xxx
HOSTED_ZONE_ID=XXXXXXXXXXX
RECORD_SET=xxx.xxx.xxx
ALIAS_HOSTED_ZONE_ID=YYYYYYYYYY
切り替え前のWeight値取得
ENV1_WEIGHT=$(aws route53 list-resource-record-sets --hosted-zone-id "${HOSTED_ZONE_ID}"|jq ".ResourceRecordSets[] | select(.Name == \"${RECORD_SET}.\" and .SetIdentifier == \"env1\") |.Weight")
ENV2_WEIGHT=$(aws route53 list-resource-record-sets --hosted-zone-id "${HOSTED_ZONE_ID}"|jq ".ResourceRecordSets[] | select(.Name == \"${RECORD_SET}.\" and .SetIdentifier == \"env2\") |.Weight")
weighted値0/255で新旧環境判断、切り替え後のWeighted値
(0->255,255->0)
NEW_ENV1_WEIGHT
NEW_ENV2_WEIGHT
エラー処理
DNS切り替え
sed \
-e "s/%ENV1_WEIGHT%/${NEW_ENV1_WEIGHT}/g" \
-e "s/%ENV2_WEIGHT%/${NEW_ENV2_WEIGHT}/g" \
-e "s/%ELB_ENDPOINT_1%/${ELB_ENDPOINT_1}/g" \
-e "s/%ELB_ENDPOINT_2%/${ELB_ENDPOINT_2}/g" \
-e "s/%RECORD_SET%/${RECORD_SET}/g" \
-e "s/%ALIAS_HOSTED_ZONE_ID%/${ALIAS_HOSTED_ZONE_ID}/g" \
/path/to/route53_template_xxxxxx.xml \
>/path/to/route53_work_xxxxxx.xml
change_result=$(/path/to/dnscurl.pl --keyfile /path/to/.aws_secrets --keyname=as-aws-account -- -H "Content-Type: text/xml; charset=UTF-8" -X POST --upload-file /path/to/route53_work_xxxxxx.xml https://route53.amazonaws.com/2013-04-01/hostedzone/${HOSTED_ZONE_ID}/rrset)
エラー処理
テンプレート
/path/to/route53_template_xxxxxx.xml
<ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
<ChangeBatch>
<Comment>
This change creates two weighted resource record sets, each of which has one value.
</Comment>
<Changes>
<Change>
<Action>UPSERT</Action>
<ResourceRecordSet>
<Name>%RECORD_SET%.</Name>
<Type>A</Type>
<SetIdentifier>env1</SetIdentifier>
<Weight>%ENV1_WEIGHT%</Weight>
<AliasTarget>
<HostedZoneId>%ALIAS_HOSTED_ZONE_ID%</HostedZoneId>
<DNSName>%ELB_ENDPOINT_1%</DNSName>
<EvaluateTargetHealth>false</EvaluateTargetHealth>
</AliasTarget>
</ResourceRecordSet>
</Change>
<Change>
<Action>UPSERT</Action>
<ResourceRecordSet>
<Name>%RECORD_SET%.</Name>
<Type>A</Type>
<SetIdentifier>env2</SetIdentifier>
<Weight>%ENV2_WEIGHT%</Weight>
<AliasTarget>
<HostedZoneId>%ALIAS_HOSTED_ZONE_ID%</HostedZoneId>
<DNSName>%ELB_ENDPOINT_2%</DNSName>
<EvaluateTargetHealth>false</EvaluateTargetHealth>
</AliasTarget>
</ResourceRecordSet>
</Change>
</Changes>
</ChangeBatch>
</ChangeResourceRecordSetsRequest>