ブログ

ryuzeeによるブログ記事。不定期更新

直近開催のScrum Alliance認定スクラムマスター研修のご案内

Azure Cloud Shellを活用してスライド公開環境を30分で作る方法

みなさんこんにちは。@ryuzeeです。

Slideshareがスライドの差し替え機能を停止したり、日本語フォントがおかしくなったりして悶絶するのを避けるために、自作のスライド公開用プラットフォームを運用しています(レポジトリはこちらです)。

このプラットフォームはAzureもしくはAWSのオブジェクトストレージやキューを使った構成になっていて、アプリケーション本体はDockerコンテナに格納しています。 今日はこの環境を、Azure上に手作業なしで作ってみたいと思います。

概要

自動でAzure上のリソースを作る方法はいろいろあります。例えばTerraformでも可能ですし、公開されている各言語用のSDKを使うこともできます。 個人的な好みは公式で提供されているコマンドラインインタフェース(CLI)を使う方法です。これであれば新サービスの登場とほぼ同時にすぐに使えます。

このスライド公開用プラットフォームを動かすのに今回は以下のサービスを利用します。

  • Blob Storage
  • Queue Storage
  • SQL Database
  • App Service

これらの作成や設定を全部CLIを使って進めます。 またコマンドの実行はAzure Portal上のAzure Cloud Shellから行います(メニューの「>_」をクリックします)。ポータル上で実行するために認証のことを考える必要もなく、常に最新のCLIが使える点がメリットです。

実行内容

実行の内容は以下のような感じになります。 何回実行しても名前の競合が起こらないように、冒頭で変数を定義し、コマンドの引数にはその値を渡すようにします (たとえば、SQL DatabaseのサーバURLやストレージアカウントのURLは重複が許されません)。 値については適宜書き換えてください。

なお、複数のサブスクリプションを持っている場合は、az account set -s サブスクリプションIDとして、どのサブスクリプションを使うか指定してから作業を開始します。

# ランダムな数値を生成しておいて各種リソース名にはそれを付与する
export rand=$RANDOM
# リソースグループ名
export resourcegroup=slide-$rand
# リージョン名
export region='Japan West'
# ストレージアカウント名
export storageaccount=slidestorage$rand
# SQL Database Serverのエンドポイント
export dbserver=slide-sqlserver-$rand
# データベース名
export dbname=slidehub
# データベースの管理者ユーザー名
export dbuser=slideadmin
# 【要変更】データベースの管理者用パスワード(適宜変更すること)
export dbpassword=YourPassW0rd
# App Serviceのサービスプラン
export appservice_plan=appserviceplan$rand
# App Serviceの名前(URLの一部になる)
export appservice_name=slidehub-$rand
# 利用するDockerイメージ
export container_image=ryuzee/slidehub:latest
# 【要変更】アプリケーションで使うシークレットキー(類推されない長い文字列)
export secretkey=03659dccb3fab0cd064b2d265257e657f21d0f060853bf5fa2dd70359a23

#=================================================================
# ここからリソースの作成処理
#=================================================================

# リソースグループを作成する
# これから作るリソースは全てこのグループに所属させることでまとめて削除できるようにする
az group create --name "$resourcegroup" --location "$region"

# ストレージアカウントを作る
az storage account create --name "$storageaccount" --resource-group "$resourcegroup" --location "$region"

# ストレージのアクセスキーを取得する
key=`az storage account keys list --account-name "$storageaccount" --resource-group "$resourcegroup" | jq -r '.[0].value'`

# Blobストレージのコンテナ(格納場所。S3でいうところのバケット)を作る
az storage container create --name "slide-files-$rand" --account-name "$storageaccount" --public-access off
az storage container create --name "slide-images-$rand" --account-name "$storageaccount" --public-access blob

# Blobストレージに対するアクセスポリシーを設定する。外部からのワンタイムでのアクセスを許すための設定
az storage cors add --methods PUT GET HEAD POST OPTIONS --origins "*" --exposed-headers "*" --allowed-headers "*" --account-name "$storageaccount" --services b

# Blob Queueを作る
az storage queue create --name "slide-queue-$rand" --account-name "$storageaccount"

# SQL Databaseのサーバを作る
az sql server create --name "$dbserver" --resource-group "$resourcegroup" --location "$region" --admin-user "$dbuser" --admin-password "$dbpassword"

# SQL Databaseのファイヤウォールポリシーを更新する。以下の例ではAzureサービス内からは全て接続を許可
az sql server firewall-rule create --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0 --name "$dbserver-rule" --resource-group "$resourcegroup" --server "$dbserver"

# データベース自体を作る
az sql db create --resource-group "$resourcegroup" --server "$dbserver" --name "$dbname"

# App Serviceのサービスプランを作成する。ここでインスタンスの大きさも指定する
az appservice plan create --name "$appservice_plan" --resource-group "$resourcegroup" --sku S2 --is-linux

# App Serviceのアプリケーションを作成する。ここでは指定したDockerイメージを使うこととしている
# また起動時にコンテナ内のスクリプトを動かし、テーブル作成やデータ作成を行う
az webapp create --resource-group "$resourcegroup" --plan "$appservice_plan" --name "$appservice_name" --deployment-container-image-name "$container_image" --startup-file /opt/application/current/script/override_startup_production.sh

# App ServiceでDockerに引き渡す環境変数を設定する
az webapp config appsettings set --resource-group "$resourcegroup" --name "$appservice_name" --settings \
OSS_AZURE_CONTAINER_NAME="slide-files-$rand" \
OSS_AZURE_IMAGE_CONTAINER_NAME="slide-images-$rand" \
OSS_AZURE_QUEUE_NAME="slide-queue-$rand" \
OSS_AZURE_STORAGE_ACCESS_KEY=$key \
OSS_AZURE_STORAGE_ACCOUNT_NAME="$storageaccount" \
OSS_DB_ENGINE=sqlserver \
OSS_DB_NAME="$dbname" \
OSS_DB_PASSWORD="$dbpassword" \
OSS_DB_PORT=1433 \
OSS_DB_URL="$dbserver.database.windows.net" \
OSS_DB_USE_AZURE=true \
OSS_DB_USERNAME="$dbuser" \
OSS_SECRET_KEY_BASE="$secretkey" \
OSS_USE_AZURE=1 \
PORT=3000

あとは20〜30分くらい待っていれば自動でスライド公開環境ができあがります。なお、当然ながらAzureのリソースの料金がかかります。 初期のアカウントは、ユーザー名がadmin@example.comで、パスワードがpassw0rdなので適宜変更してから遊んでみると良いでしょう。

ログインして管理画面上でカスタマイズするとこんな感じにできます。

環境の削除

すべて同じリソースグループの中に入れているので、削除自体も簡単です。同じようにAzure Cloud Shellなどで以下を実行します。

az group delete --name リソースグループ名 --no-wait --yes

まとめ

CLI最高マネージド最高

アジャイル開発チーム向けのコーチングや、技術顧問、Scrum Alliance認定スクラムマスター研修などのトレーニングを提供しています。お気軽にご相談ください(初回相談無料)
前の記事 スクラムガイド2017での変更点の紹介
次の記事 アジャイル開発やスクラムのトレーニングでよく聞かれる質問とその答え (1)

プロダクト開発で、こんな課題を感じていませんか?

  • 何を作るべきか、順位の決め方が定まらない
  • プロダクトの方向性をチームで共有できていない
  • 開発組織の体制や役割がうまく機能していない
  • 開発プロセスが形骸化し、目的を見失っている
  • アジャイルを導入したが、組織に定着しない

プロダクトマネジメント、組織構造、開発プロセスの課題について、組織全体の視点から支援します。

お問い合わせ(初回相談無料)

契約を前提にした相談でなくて構いません。相談に際して事前の整理や準備は不要です。

Aligned ―プロダクト開発におけるステークホルダーとの関係性の築き方
ダイナミックリチーミング 第2版
Tidy First?
脳に収まるコードの書き方
プロダクトマネージャーのしごと 第2版
エンジニアリングマネージャーのしごと
チームトポロジー
スクラム実践者が知るべき97のこと
プロダクトマネジメント
SCRUM BOOT CAMP THE BOOK
みんなでアジャイル
レガシーコードからの脱却
Effective DevOps
変革の軌跡
ジョイ・インク
アジャイルコーチの道具箱
カンバン仕事術
Software in 30 Days
How to Change the World