久しぶりの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)

昨日の続き。時間がなかったのでストレージアカウントの作成のみ。

ストレージアカウントについて

ストレージアカウントは以下の用途に使用される

  1. 仮想マシンのイメージ置き場
  2. 仮想マシンの診断情報の保存先
  3. まだあるはず

ストレージアカウントの作成

ストレージアカウント名はグローバルで一位である必要があるので注意が必要

  • 以下のコマンドだと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 の案件が一月流れて、今月暇になってしまったので、適当なシステムを構築して、自分の知識を棚卸ししてみようと思う。

作成するシステム

f:id:kwy:20190903194703j:plain
図1 構成図第一案

外部からの要求を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

リソースグループの構成

リソースグループはライフサイクルを共有するリソースでまとめるのが鉄則。検討の余地があるが、現状では以下のようにした。

リソースグループの名前は "<サービス名略称>-<環境>-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 に公開されていたのでこれを使ってみる

  1. docker イメージをpull する
    docker pull python:latest
  2. イメージサイズの確認
    docker images
  3. docker コンテナの起動
    docker run -it --name pylearn python:latest /bin/bash

"--name" は、docker コンテナを識別するための名前。
"-it", "/bin/bash" は、 /bin/bash に対して tty を割り当て、 STDIN をオープンする。つまりこれを指定しないと対話型シェルを実行できない。

Azure CLI 環境をdocker でまかなう

最近フリーランスおじさんになったので、ローカルに環境依存したあれやこれやを作るのも嫌だなぁと思った次第。 Microsoft 社がDocker イメージを提供してくれていたことに感謝することしきりである。 AWSGCP も同様のものがあるのだろうけど、今はAzure で働いているので今回はこれで完了。

  1. docker イメージをpull する docker image pull microsoft/azure-cli:latest

  2. イメージサイズの確認 docker images microsoft/azure-cli:latest

  3. 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 のエッジロケーションを利用してネットワークの高速化が可能になる

もうちょっと続く