【最終回】(続)静的Webサイトホスティング二重化してみる(その5)

 静的サイトWebホスティングシリーズもこれで最後です。

最後の難関Terrformです。GCPの時にAWSの部分は作っていて、そのまま動くか不安でしたが、ほぼそのまま動いてくれたのでAWSはほぼ流用です。

Azureでこちらの作成がメインです。自分が弱いだけに方々からコピペして作成しています。日本語の情報があまりない(自分の探し方が下手)ので英語のサイトばっか漁りましたが

英語が絶望的なのでほとんど情報が見つけられませんでした。

もっと気が利いた表現が英語でできればかなり早く調べられるのになぁ。

50近いおっさんがそんなすぐにツヨツヨにはなれないので地道に調べるしかないです。

まぁ、今回の構成は世間で既に誰かがやっているかもしれませんが・・・残念ながら見つけられませんでした。


◆シリーズ

その1:AWSでCloudFront+S3構成を作る

その2:AzureでApplicationGateway+Blob構成を作る

その3:DNSでフェイルオーバー設定

その4:S3とBlobにGitHubActions使ってコンテンツ同期

その5:TerraformでIaC化


◆Version関連

Ubuntu20.04LTS
Client: Docker Engine - Community
 Version:           19.03.13
docker-compose version 1.24.0, build 0aa59064
Terraform v1.2.2


◆事前準備

#Azureコンテナ起動
$ docker container run --name azure-terraform-dev -h \
  terraform-dev -it -d \
  --mount type=bind,src=$(pwd)/aws_azure,dst=/aws_azure \
  --restart=always \
  -e TZ=Asia/Tokyo multicloud-ubuntu /bin/bash
$ docker exec -it azure-terraform-dev /bin/bash
#1.AWS認証情報設定
# aws configure
AWS Access Key ID [None]: YOURACCESSKEY
AWS Secret Access Key [None]: YOURSEACRETACCESSKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
#2.Azure認証情報設定
# az upgrade
# az login
#・認証情報取得
# az account list --query "[].{name:name, subscriptionId:id, tenantId:tenantId}"
# az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/yoursubscription"
#・環境変数設定
# cd
# vi .bashrc
-------------------
export ARM_SUBSCRIPTION_ID=yoursubscription
export ARM_CLIENT_ID=your_appId
export ARM_CLIENT_SECRET=your_password
export ARM_TENANT_ID=your_tenant
export ARM_ENVIRONMENT=public
-------------------
#3.terraformアップデート
#・tfenvのアップデート
# cd
# git -C ~/.tfenv pull
#terraformのアップデート
# tfenv install latest
# tfenv use 1.2.2
# terraform init


◆terraformで構築(Dockerホスト内作業)

#1.ShellスクリプトでRoute53のZone登録(Dockerホスト内で実行)
# cd /aws_azure
# sh/make_hosted_zone.sh yourdomain

#2.freenomのNameServerにRoute53のNSを登録

#3.Let'sEncryptでTXTレコード発行(別ターミナルで実行)
# certbot certonly --manual -d yourdomain --preferred-challenges dns

#4.TXT文字列をRoute53に追加
# sh/letsencrypt_dns_setting.sh yourdomain _acme-challenge YOURSTRING

#5.Let'Encryptの発行画面でEnterを押下して証明書発行

#6.pfxファイルに変換
# sh/makepfx.sh yourpfxfilename yourcertpasswd

#7.Terraform実行
# terraform plan
# terraform apply


◆ディレクトリ構造

.
|-- awsstatic
|   |-- cloudfront.tf
|   |-- output.tf
|   |-- s3.tf
|   `-- variables.tf
|-- azurestatic
|   |-- applicationgateway.tf
|   |-- blob.tf
|   |-- output.tf
|   `-- variables.tf
|-- cert
|   `-- cert.pfx
|-- failoverdns
|   |-- main.tf
|   `-- variables.tf
|-- main.tf
|-- sh
|   |-- alias_arecord_delete.sh
|   |-- letsencrypt_dns_setting.sh
|   |-- make_hosted_zone.sh
|   `-- makepfx.sh
|-- terraform.tfstate
|-- terraform.tfstate.backup
|-- variables.tf
`-- zone_acm
    |-- main.tf
    |-- output.tf
    `-- variables.tf


◆TerraformおよびShellスクリプトファイル

量が多くて長くなるのでGitHubに上げました。

(汚いしイケてないtfとかShellスクリプトですがヨワイノデ勘弁してください。)

https://github.com/Otazoman/terraform_dupulicate_staticsite/tree/main/aws_azure


◆参考サイト

・Blobストレージ静的サイトホスティング

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/storage_account

https://lgulliver.github.io/deploy-storage-account-static-site-terraform-azure-devops/

https://github.com/hashicorp/terraform-provider-azurerm/issues/1903

https://gaunacode.com/creating-an-azure-storage-account-for-static-site-hosting-using-terraform

・ApplicationGateway

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/application_gateway

https://docs.microsoft.com/en-us/azure/developer/terraform/deploy-application-gateway-v2

https://qiita.com/moaikids/items/26ee0db670ae9d9fa158

https://stackoverflow.com/questions/66523796/two-frontend-ports-of-application-gateway-are-using-the-same-port-443-azure-ap

https://github.com/hashicorp/terraform-provider-azurerm/issues/552

https://www.wenyanet.com/opensource/ja/611a2062506e380fcd7143dc.html

https://docs.microsoft.com/en-us/answers/questions/643225/is-there-a-web-redirect-method-or-example-using-an.html

https://faun.pub/build-an-azure-application-gateway-with-terraform-8264fbd5fa42

・Let'sEncryptのDNS認証

https://letsencrypt.org/ja/docs/challenge-types/

https://qiita.com/gbgb-ojisan/items/be8a35270a84b6b7ca2e

https://qiita.com/AkiQ/items/db4eb8c7106f109819f0

https://qiita.com/Shinya-Yamaguchi/items/7cb034bf05b93fe46d33


これでAzure+AWS、GCP+AWSで静的サイトホスティング冗長化構成はできるようになりました。CloudFrontが落ちてもフェイルオーバーでGoogleとかMicrosoftとかで運用継続できるので少しだけ安心感が増すことになるかと思います。

GCPと比較するとAzureではIPv6を割当できないので、個人的にはAWS+GCPの構成の方がおススメです。IPv4だけでいいんだという場合はAWS+Azureでいいんですけどね・・・

ひとまずは2年かかりましたがフロント側のマルチクラウドについては色々と選択肢があることは分かりました。次はバックエンド側でマルチクラウドで面白そうなことができないか調べていければなぁと思ってます。

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)