チュートリアル:Azure Database for MySQL - フレキシブル サーバーを使用して WordPress アプリを AKS にデプロイする

適用対象: Azure Database for MySQL - フレキシブル サーバー

このクイックスタートでは、Azure CLI を使用して、Azure Database for MySQL - フレキシブル サーバーで Azure Kubernetes Service (AKS) クラスターに WordPress アプリケーションをデプロイします。 AKS は、クラスターをすばやくデプロイして管理できるマネージド Kubernetes サービスです。 Azure Database for MySQL フレキシブル サーバー は、データベース管理機能と構成設定のよりきめ細かな制御と柔軟性を提供するように設計されたフル マネージド データベース サービスです。

注意

このクイックスタートは、Kubernetes の概念、WordPress、MySQL.に関する基礎知識があることを前提としています。

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。 Azure 無料アカウントがあれば、Azure Database for MySQL - フレキシブル サーバーを 12 か月間無料でお試しいただけます。 詳細な情報については、「フレキシブル サーバーを無料で試す」を参照してください。

前提条件

  • Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。

  • CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。

    • ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。

    • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。

    • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。

  • この記事では、Azure CLI の最新バージョンが必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。

注意

このクイックスタートのコマンドを (Azure Cloud Shell ではなく) ローカルで実行する場合は、必ず管理者としてコマンドを実行してください。

リソース グループを作成する

Azure リソース グループは、Azure リソースが展開され管理される論理グループです。 [az group create][az-group-create] コマンドを実行して、eastus の場所に wordpress-project というリソース グループを作成しましょう。

az group create --name wordpress-project --location eastus

注意

リソース グループの場所は、リソース グループのメタデータが保存される場所です。 また、リソースの作成時に別のリージョンを指定しない場合に、Azure でリソースが実行される場所でもあります。

次の出力例では、正常に作成されたリソース グループが示されています。

{
  "id": "/subscriptions/<guid>/resourceGroups/wordpress-project",
  "location": "eastus",
  "managedBy": null,
  "name": "wordpress-project",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

AKS クラスターの作成

AKS クラスターを作成するには、az aks create コマンドを使用します。 次の例では、myAKSCluster という名前のクラスターを 1 つのノードで作成します。 これは完了までに数分かかる場合があります。

az aks create --resource-group wordpress-project --name myAKSCluster --node-count 1 --generate-ssh-keys

数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

注意

AKS クラスターを作成すると、AKS リソースを保存するための 2 つ目のリソース グループが自動的に作成されます。 「AKS と一緒にリソース グループが 2 つ作成されるのはなぜでしょうか?」を参照してください。

クラスターに接続する

Kubernetes クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使用します。 Azure Cloud Shell を使用している場合、kubectl は既にインストールされています。 kubectl をローカルにインストールするには、az aks install-cli コマンドを使用します。

az aks install-cli

Kubernetes クラスターに接続するように kubectl を構成するには、az aks get-credentials コマンドを使用します。 このコマンドは、資格情報をダウンロードし、それを使用するように Kubernetes CLI を構成します。

az aks get-credentials --resource-group wordpress-project --name myAKSCluster

Note

上記のコマンドは、Kubernetes 構成ファイルの既定の場所 (~/.kube/config) を使用します。 --file を使用すると、Kubernetes 構成ファイルに対して別の場所を指定できます。

クラスターへの接続を確認するには、クラスター ノードの一覧を返す kubectl get コマンドを使用します。

kubectl get nodes

次の出力例は、前の手順で作成した単一ノードを示しています。 ノードの状態が "準備完了" であることを確認します。

NAME                       STATUS   ROLES   AGE     VERSION
aks-nodepool1-31718369-0   Ready    agent   6m44s   v1.12.8

Azure Database for MySQL - フレキシブル サーバーを作成する

az mysql flexible-server create コマンドを使用して、フレキシブル サーバーを作成します。 次のコマンドでは、サービスの既定値と Azure CLI のローカル コンテキストからの値を使用してサーバーを作成します。

az mysql flexible-server create --public-access <YOUR-IP-ADDRESS>

作成されたサーバーには、次の属性があります。

  • サーバーが最初にプロビジョニングされたときに、新しい空のデータベース flexibleserverdb が作成されます。 このクイックスタートでは、このデータベースを使用します。
  • 自動生成されたサーバー名、管理者ユーザー名、管理者パスワード、リソース グループ名 (ローカル コンテキストでまだ指定されていない場合)、およびリソース グループと同じ場所
  • 残りのサーバー構成のサービスの既定値: コンピューティング レベル (バースト可能)、コンピューティング サイズ/SKU (B1MS)、バックアップの保持期間 (7 日間)、および MySQL のバージョン (5.7)
  • public-access 引数を使用すると、パブリック アクセスがファイアウォール規則で保護されたサーバーを作成できます。 IP アドレスを指定して、クライアント マシンからのアクセスを許可するファイアウォール規則を追加します。
  • このコマンドはローカル コンテキストを使用しているため、eastus リージョンの wordpress-project リソース グループにサーバーが作成されます。

コンテナーの定義

次の例では、Nginx Web サーバーと PHP FastCGI プロセッサの 2 つのコンテナーを作成していますが、これは、Docker Hub で公開されている nginxwordpress (FastCGI をサポートする fpm バージョン) の公式の Docker イメージに基づいています。

または、カスタムの Docker イメージをビルドし、イメージを Docker ハブまたは Azure Container Registry にデプロイすることもできます。

重要

Azure Container Registry (ACR) を使用している場合は、az aks update コマンドを実行して ACR アカウントを AKS クラスターに接続します。

az aks update -n myAKSCluster -g wordpress-project --attach-acr <your-acr-name>

Kubernetes マニフェスト ファイルを作成する

Kubernetes のマニフェスト ファイルでは、どのコンテナー イメージを実行するかなど、クラスターの望ましい状態を定義します。 mywordpress.yaml という名前のマニフェスト ファイルを作成し、次の YAML 定義をコピーしましょう。

重要

  • MySQL フレキシブル サーバーの SERVERNAMEYOUR-DATABASE-USERNAMEYOUR-DATABASE-PASSWORD で下記の env セクションを更新します。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wp-blog
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wp-blog
  template:
    metadata:
      labels:
        app: wp-blog
    spec:
      containers:
      - name: wp-blog-nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d
        - name: wp-persistent-storage
          mountPath: /var/www/html

      - name: wp-blog-php
        image: wordpress:fpm
        ports:
        - containerPort: 9000
        volumeMounts:
        - name: wp-persistent-storage
          mountPath: /var/www/html
        env:
        - name: WORDPRESS_DB_HOST
          value: "<<SERVERNAME.mysql.database.azure.com>>" #Update here
        - name: WORDPRESS_DB_USER
          value: "<<YOUR-DATABASE-USERNAME>>"  #Update here
        - name: WORDPRESS_DB_PASSWORD
          value: "<<YOUR-DATABASE-PASSWORD>>"  #Update here
        - name: WORDPRESS_DB_NAME
          value: "<<flexibleserverdb>>"
        - name: WORDPRESS_CONFIG_EXTRA # enable SSL connection for MySQL
          value: | 
            define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
      volumes:
      - name: config
        configMap:
          name: wp-nginx-config
          items:
          - key: config
            path: site.conf

      - name: wp-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values:
                    - wp-blog
              topologyKey: "kubernetes.io/hostname"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wp-blog
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: v1
kind: Service
metadata:
  name: blog-nginx-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
  selector:
    app: wp-blog
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: wp-nginx-config
data:
  config : |
    server {
         listen       80;
         server_name  localhost;
         root         /var/www/html/;

         access_log /var/log/nginx/wp-blog-access.log;
         error_log  /var/log/nginx/wp-blog-error.log error;
         index index.html index.htm index.php;

         
        location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
           expires max;
           index index.php index.html index.htm;
           try_files $uri =404;
        }

        location / {
          index index.php index.html index.htm;
          
          if (-f $request_filename) {
            expires max;
            break;
          }
          
          if (!-e $request_filename) {
            rewrite ^(.+)$ /index.php?q=$1 last;
          }
        }

        location ~ \.php$ {
           fastcgi_split_path_info ^(.+\.php)(/.+)$;
           fastcgi_pass localhost:9000;
           fastcgi_index index.php;
           include fastcgi_params;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
           fastcgi_param SCRIPT_NAME $fastcgi_script_name;
           fastcgi_param PATH_INFO $fastcgi_path_info;
        }
      }

WordPress を AKS クラスターにデプロイする

kubectl apply コマンドを使用してアプリケーションをデプロイし、ご利用の YAML マニフェストの名前を指定します。

kubectl apply -f mywordpress.yaml

次の出力例は、正常に作成されたデプロイおよびサービスを示しています。

deployment "wordpress-blog" created
service "blog-nginx-service" created

アプリケーションをテストする

アプリケーションが実行されると、Kubernetes サービスによってアプリケーション フロント エンドがインターネットに公開されます。 このプロセスが完了するまでに数分かかることがあります。

進行状況を監視するには、kubectl get service コマンドを --watch 引数と一緒に使用します。

kubectl get service blog-nginx-service --watch

最初は、wordpress-blog サービスの EXTERNAL-IPpending (保留中) として表示されます。

NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
blog-nginx-service  LoadBalancer   10.0.37.27   <pending>     80:30572/TCP   6s

EXTERNAL-IP アドレスが "保留中" から実際のパブリック IP アドレスに変わったら、CTRL-C を使用して kubectl ウォッチ プロセスを停止します。 次の出力例は、サービスに割り当てられている有効なパブリック IP アドレスを示しています。

 blog-nginx-service  LoadBalancer   10.0.37.27   52.179.23.131   80:30572/TCP   2m

WordPress を参照する

Web ブラウザーを開いてサービスの外部 IP アドレスにアクセスすると、WordPress のインストール ページが表示されます。

AKS および MySQL フレキシブル サーバーでの WordPress のインストールの成功

注意

リソースのクリーンアップ

Azure の課金を回避するには、不要なリソースをクリーンアップする必要があります。 クラスターが必要なくなったら、az group delete コマンドを使って、リソース グループ、コンテナー サービス、およびすべての関連リソースを削除してください。

az group delete --name wordpress-project --yes --no-wait

注意

クラスターを削除したとき、AKS クラスターで使用される Azure Active Directory サービス プリンシパルは削除されません。 サービス プリンシパルを削除する手順については、AKS のサービス プリンシパルに関する考慮事項と削除に関するページを参照してください。 マネージド ID を使用した場合、ID はプラットフォームによって管理されるので、削除する必要はありません。

次のステップ