【最終回】(続)静的Webサイトホスティング二重化してみる(その5)
静的サイトWebホスティングシリーズもこれで最後です。
最後の難関Terrformです。GCPの時にAWSの部分は作っていて、そのまま動くか不安でしたが、ほぼそのまま動いてくれたのでAWSはほぼ流用です。
Azureでこちらの作成がメインです。自分が弱いだけに方々からコピペして作成しています。日本語の情報があまりない(自分の探し方が下手)ので英語のサイトばっか漁りましたが
英語が絶望的なのでほとんど情報が見つけられませんでした。
もっと気が利いた表現が英語でできればかなり早く調べられるのになぁ。
50近いおっさんがそんなすぐにツヨツヨにはなれないので地道に調べるしかないです。
まぁ、今回の構成は世間で既に誰かがやっているかもしれませんが・・・残念ながら見つけられませんでした。
◆シリーズ
その2:AzureでApplicationGateway+Blob構成を作る
その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://github.com/hashicorp/terraform-provider-azurerm/issues/552
https://www.wenyanet.com/opensource/ja/611a2062506e380fcd7143dc.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年かかりましたがフロント側のマルチクラウドについては色々と選択肢があることは分かりました。次はバックエンド側でマルチクラウドで面白そうなことができないか調べていければなぁと思ってます。
※2024年9月に少し修正して最新のterraform(1.9.5)で動作確認しました。GitHub参照してください。
コメント