久しぶりのRubyKaigi 参戦記(覚書)
memo
変わらないこと、変わったこと
- RubyKaigi は10年弱ぶりだったが、相変わらず「他人と交流しろ」圧が強い
- 懐かしい人、いなくなった人、新しい人
- id: dominion525 氏にロンドン在住文化人類学者さんを紹介していただいたけど、全く喋れなかったツラい
- るりまは今も漸進的に刷新中
- 名前は変われどTRICK を見ると「超絶技巧 Ruby プログラミング」を見たときの感動が蘇る
- 「やぁ ここは Ruby をつくるひとのむら だよ」
- 低レイヤーの話がめっちゃ多い。中間コードとか奇界語 or 魔神語の話が普通に出てくる
- 公用語が英語
- スライドのほぼ全てが英語
- 日本人スピーカーでも英語発表者が結構居た
発表の傾向
- wasm
- メモリチューニング
- 処理系高速化 / JIT
- 型付け
Microsoft Azure 試し打ち(閑話休題)
今日は時間が取れなかったので、現時点で予定している今後の作業内容を。
ここからはお金がかかる作業なのでできるだけ机上で検証してからまとめて更新したい……。ちなみに週末は泊りでお出かけするので検証時間が取れない……。
- VM (web サーバー) の作成
- 事前に準備するリソースの作成(パブリックIP, ストレージアカウントなど)
- VM 本体の作成
- パブリックロードバランサーの作成
- 下にVM をぶら下げる
- Azure Database for MySQL (master) の作成
- Azure Database for MySQL (replica) の作成
- 内部ロードバランサーの下に置けるかはまだ調べていない
- Azure Redis Cache (master) の作成
- Azure Redis Cache (replica) の作成
- 内部ロードバランサーの下に置けるかはまだ調べていない
- 内部ロードバランサーの作成
- ここでデータストア類のreplica 達をぶら下げる。
- Azure Active Directory を使用した権限管理
- 多分RBAC とかIAM とかの話。この辺り触るの初めてなので苦戦しそう。
- Azure Monitor の使用
- 障害 / メンテナンス情報の通知
- 監視項目の設定と通知
- Slack やChatWork への通知
- Appendix
- DB がPostgreSQL の場合
- VM ではなくAppService でDocker コンテナーを動かす場合
- パブリックロードバランサーにSSL 証明書を入れる
- Traffic Manager を利用する
- Azure Application Gateway を利用する
他になんかあるかなぁ。とりあえず上記は試してみたい。
Microsoft Azure 試し打ち(2)
昨日の続き。時間がなかったのでストレージアカウントの作成のみ。
ストレージアカウントについて
ストレージアカウントは以下の用途に使用される
ストレージアカウントの作成
ストレージアカウント名はグローバルで一位である必要があるので注意が必要
- 以下のコマンドだとHDD になるが、SSD にするためのオプションが有るか確認しておくこと
#!/usr/bin/env bash set -euo pipefail read -p "ストレージアカウント名を入力してください: " saccount_name resouce_group=contosovnet-prod-rg read -p "ストレージアカウントのロケーションを入力してください: " location read -p "ストレージアカウントのレプリケーションレベルを入力してください(Premium_LRS, Premium_ZRS, Standard_GRS, Standard_GZRS, Standard_LRS, Standard_RAGRS, Standard_RAGZRS, Standard_ZRS): " repli_sku read -p "ストレージアカウントの種類を入力してください(BlobStorage, BlockBlobStorage, FileStorage, Storage, StorageV2): " storage_kind read -p "ストレージアカウントのアクセス頻度を入力してください(Cool, Hot): " access_tier read -p "HTTP アクセスを許可します(true)か? HTTPS アクセスに制限します(false)か?: " http_only az storage account list --resource-group ${resouce_group} --output table az storage account create --name ${saccount_name} \ --resource-group ${resouce_group} \ --access-tier ${access_tier} \ --https-only ${http_only} \ --kind ${storage_kind} \ --location ${location} \ --sku ${repli_sku} \ --tags env=prod role=storage_account az storage account list --resource-group ${resouce_group} --output table
ストレージアカウントキーの確認
ストレージアカウントキー = ストレージアカウントにアクセスする際のクレデンシャル。2 種類が表示される(キーが2つ存在する)
#!/usr/bin/env bash set -euo pipefail read -p "ストレージアカウント名を入力してください: " saccount_name resouce_group=contosovnet-prod-rg az storage account keys list --account-name ${saccount_name} --output table
明日は仮想マシンの作成(ここ調べるのに時間がかかった)から。
Microsoft Azure 試し打ち(1)
Microsoft Azure の案件が一月流れて、今月暇になってしまったので、適当なシステムを構築して、自分の知識を棚卸ししてみようと思う。
作成するシステム
外部からの要求をLB で受け、それをweb アプリが動作しているVM に割り振る。web サーバー以降のRedis, MySQL への接続は、Master への接続は直接、レプリカへの接続はインターナルLB を介して行うという、まぁよくある構成ではないかと。
必要なリソースの確認
図1 にあるリソースを作成するには、更に細かいリソースが必要となる。以下に必要となるリソースを表にまとめてみた(作成中)。
表1 必要なリソース一覧(作成中)
# | 種類 | リソース | 解説 |
---|---|---|---|
1 | 仮想ネットワーク | 仮想ネットワーク | |
2 | ネットワークセキュリティグループ | ||
3 | 仮想マシン | 仮想マシン | |
4 | ディスク | ||
5 | ストレージアカウント | ||
6 | ネットワークインターフェース | ||
7 | パブリックIPアドレス | ||
8 | ネットワークセキュリティグループ | ||
9 | ロードバランサー | ||
10 | Azure Database for MySQL | ||
11 | Azure Cache Redis |
リソースグループの構成
リソースグループはライフサイクルを共有するリソースでまとめるのが鉄則。検討の余地があるが、現状では以下のようにした。
- パブリックロードバランサー
- web サーバー(VM)
- インターナルロードバランサー
- MySQL(master)
- MySQL(replica)
- Redis(Master)
- Redis(Replica)
- VNet
リソースグループの名前は "<サービス名略称>-<環境>-rg"とした。 - contosopublb-prod-rg - contosoweb-prod-rg - contosoimtlb-prod-rg - contosomdb-prod-rg - contosordb-prod-rg - contosomredis-prod-rg - contosorredis-prod-rg - contosovnet-prod-rg
リソースグループの作成
では実際に作成。ようやくAzure CLI の出番
- create_rg.sh
#!/usr/bin/env bash set -euo pipefail read -p "リソースグループのロケーションを入力してください: " location az group list --output table for resource_group in contosopublb-prod-rg contosoweb-prod-rg contosoimtlb-prod-rg contosomdb-prod-rg contosordb-prod-rg contosomredis-prod-rg contosorredis-prod-rg contosovnet-prod-rg do az group create --location ${location} \ --name ${resource_group} \ --tags env=prod role=resource_group done az group list --output table
VNet の構成
VNet は、グローバルロードバランサーから右側のすべてを1つにまとめることにする。
VNet の作成
- create_vnet.sh
#!/usr/bin/env bash set -euo pipefail read -p "VNet の名前を入力してください: " vnet_name resource_group=contosovnet-prod-rg read -p "VNet のIPアドレス空間を入力してください(例: 10.2.0.0/16): " vnet_cidr ddos_protection=true location=japanwest az network vnet list --output table az network vnet create --name ${vnet_name} \ --resource-group ${resource_group} \ --address-prefixes ${vnet_cidr} \ --location ${location} \ --tags env=prod role=vnet az network vnet list --output table
サブネットの構成
作成したVNet をweb サーバー群が所属する "public"と、DB, Redis 群が所属する "private" というサブネットに分ける
サブネットの作成
- create_subnet_external.sh
#!/usr/bin/env bash set -euo pipefail read -p "サブネットのIPアドレス範囲を入力してください(例: 10.2.0.0/24): " subnet_cidr subnet_name=public reource_group=contosovnet-prod-rg read -p "VNet の名前を入力してください: " vnet_name az network vnet subnet list --resource-group ${resource_group} --vnet-name ${vnet_name} --output table az network vnet subnet create --address-prefixes ${subnet_cidr} \ --name ${subnet_name} \ --resource-group ${reource_group} \ --vnet-name ${vnet_name} az network vnet subnet list --resource-group ${resource_group} --vnet-name ${vnet_name} --output table
- create_subnet_internal.sh
#!/usr/bin/env bash set -euo pipefail read -p "サブネットのIPアドレス範囲を入力してください(例: 10.2.3.0/24): " subnet_cidr subnet_name=private reource_group=contosovnet-prod-rg read -p "VNet の名前を入力してください: " vnet_name az network vnet subnet list --resource-group ${resource_group} --vnet-name ${vnet_name} --output table az network vnet subnet create --address-prefixes ${subnet_cidr} \ --name ${subnet_name} \ --resource-group ${reource_group} \ --vnet-name ${vnet_name} az network vnet subnet list --resource-group ${resource_group} --vnet-name ${vnet_name} --output table
ネットワークセキュリティグループ(NSG)の設計
NSG は、サブネットとNIC のそれぞれに対して設定できるが、今回の構成ではサブネットのみの設定で用が足りるため、NIC に対しては設定しない。
public サブネット
public サブネットでは、80, 443ポートへの通信のみを受け付ける。また、SSH 接続を行うため、特定IP アドレスからの22ポートへの通信を受け付ける。
private サブネット
private サブネットでは、web サーバー群からのAzure Database for MySQLへの接続(3306ポート)とAzure Cache Redis への接続(6379ポート。SSL では6380)が必要となる。ただし、デフォルトでプライベートネットワーク内での通信に制限はないため、NSG を設定する必要はない。
NSG の作成
NSG は、作成後ルールを設定していく
- create_public_nsg.sh
#!/usr/bin/env bash set -euo pipefail read -p "NSG の名前を入力してください: " nsg_name reource_group=contosovnet-prod-rg read -p "NSG のロケーションを入力してください: " location az network nsg list --output table az network nsg create --name ${nsg_name} \ --resource-group ${resource_group} \ --location ${location} \ --tags env=prod role=nsg az network nsg list --output table
NSG 規則の作成
- configure_public_nsg_rules.sh
#!/usr/bin/env bash set -euo pipefail # Allow_HTTP_HTTPS read -p "NSG 規則の名前を入力してください: " nsg_rule_name nsg_name=contoso-web-nsg # 100 read -p "規則の優先度を入力してください: " rule_priority reource_group=contosovnet-prod-rg # japanwest read -p "NSG のロケーションを入力してください: " location az network nsg rule list --nsg-name ${nsg_name} \ --resource-group ${resource_group} \ --output table az network nsg rule create --name ${nsg_rule_name} \ --nsg-name ${nsg_name} \ --priority ${rule_priority} \ --resource-group ${reource_group} \ --access Allow \ --destination-address-prefixes Internet \ --destination-port-ranges 80 443 \ --direction Inbound \ --protocol '*' \ --source-address-prefixes '*' \ --source-port-ranges '*' az network nsg rule list --nsg-name ${nsg_name} \ --resource-group ${resource_group} \ --output table
作成したNSG をサブネットに適用する
- この部分、作業前後の確認ができていないので「サブネットにアタッチされたNSG を特定する」コマンドを確認する
#!/usr/bin/env bash set -euo pipefail # external read -p "サブネット の名前を入力してください: " subnet_name reource_group=contosovnet-prod-rg # contoso-prod-vnet read -p "VNet の名前を入力してください: " vnet_name # contoso-web-nsg read -p "NSG の名前を入力してください: " nsg_name # az network vnet subnet show --name ${subnet_name} \ # --resource-group ${reource_group} \ # --vnet-name ${vnet_name} \ # --verbose \ # --output table az network vnet subnet update --name ${subnet_name} \ --network-security-group ${nsg_name} \ --resource-group ${reource_group} \ --vnet-name ${vnet_name} # az network vnet subnet show --name ${subnet_name} \ # --resource-group ${reource_group} \ # --vnet-name ${vnet_name} \ # --verbose \ # --output table
今日はここで力尽きたので、続きはまた後日。
Python の学習環境をdocker でまかなう
前回と同様のネタ。
Docker Hub に公開されていたのでこれを使ってみる
- docker イメージをpull する
docker pull python:latest
- イメージサイズの確認
docker images
- docker コンテナの起動
docker run -it --name pylearn python:latest /bin/bash
"--name" は、docker コンテナを識別するための名前。
"-it", "/bin/bash" は、 /bin/bash に対して tty を割り当て、 STDIN をオープンする。つまりこれを指定しないと対話型シェルを実行できない。
Azure CLI 環境をdocker でまかなう
最近フリーランスおじさんになったので、ローカルに環境依存したあれやこれやを作るのも嫌だなぁと思った次第。 Microsoft 社がDocker イメージを提供してくれていたことに感謝することしきりである。 AWS やGCP も同様のものがあるのだろうけど、今はAzure で働いているので今回はこれで完了。
docker イメージをpull する
docker image pull microsoft/azure-cli:latest
イメージサイズの確認
docker images microsoft/azure-cli:latest
docker イメージの起動
docker run --rm -it microsoft/azure-cli:latest
"-rm" オプションは「コンテナを停止した時にコンテナ全部を消しますよ」の意。
この後は普通にaz コマンドを使用する。
S3 のお勉強(その3)
- バケット名はグローバルレベルで一意である必要があるが、S3 自体はリージョン単位でのサービスである
意外とハマる
バージョン管理
- バージョン管理を一旦有効化すると、無効化することはできない(停止: suspend することは可能)
- バージョン管理を有効にした場合、最新ファイルを削除しても旧バージョンは残る
- バージョン管理はバケット単位で設定可能
- ライフサイクル管理と組み合わせて使用する
ライフサイクル管理
- 128KB 以上のファイルがS3 からS3-IA に移動される
- デフォルト30日でS3-IA に移動し、さらに30日でGlacier に移動する
- ライフサイクル管理ではバージョニングは必須ではないが、バージョニングを使用すると現バージョンと前バージョンを管理できる
S3 Transfer Acceleration
- CloudFront のエッジロケーションを利用してネットワークの高速化が可能になる
もうちょっと続く