IK.AM

@making's tech note


Cloud FoundryのSMB BrokerでAzure Filesを使う

🗃 {Dev/PaaS/CloudFoundry/PCF}
🏷 Cloud Foundry 🏷 PAS 🏷 Pivotal Cloud Foundry 🏷 Azure 🏷 Azure Files 
🗓 Updated at 2020-03-22T12:59:51Z  🗓 Created at 2020-03-21T15:37:19Z   🌎 English Page

Cloud Foundry / Pivotal Application Services(PAS)ではコンテナに永続ディスクをアタッチする用途でSMBとNFSのService Brokerが用意されています。

Pivotal Application Servicesは最近リブランドされ、VMware Tanzu Application Service (TAS)にリネームされました。

ただし、SMBやNFSのprovisioningはサポートされておらず既存のサーバーをマウントするのみです。 別途、SMBサーバーを用意したくないので、AzureのManaged ServiceであるAzure Filesを使って試してみます。 Azure FilesはSMB 3.0に対応しています。

SMB Brokerについては次のドキュメントを参照してください。

また、PASでSMB Brokerを有効にする方法はこちらを参照してください。

Azure FilesのProvisioning

azコマンドでAzure Filesリソースを作成します。

export TENANT_ID=....
export CLIENT_ID=....
export CLIENT_SECRET=....
export LOCATION="Japan East"
export RESOURCE_GROUP=azure-files-demo
export STORAGE_ACCOUNT_NAME=makiazurefilesdemo
export SHARE_NAME=demoshare

az login --username ${CLIENT_ID} \
         --password ${CLIENT_SECRET} \
         --service-principal \
         --tenant ${TENANT_ID} 

az group create --name ${RESOURCE_GROUP} \
  --location "${LOCATION}"

az storage account create --name ${STORAGE_ACCOUNT_NAME} \
  --resource-group ${RESOURCE_GROUP} \
  --location "${LOCATION}" \
  --kind StorageV2 \
  --sku Standard_ZRS \
  --enable-large-file-share \
  --output none

# OR
# 
# az storage account create --name ${STORAGE_ACCOUNT_NAME} \
#   --resource-group ${RESOURCE_GROUP} \
#   --location "${LOCATION}" \
#   --kind FileStorage \
#   --sku Premium_LRS \
#   --output none

STORAGE_ACCOUNT_KEY=$(az storage account keys list \
    --resource-group ${RESOURCE_GROUP} \
    --account-name ${STORAGE_ACCOUNT_NAME} \
    --query "[0].value" | tr -d '"')

az storage share create \
    --account-name ${STORAGE_ACCOUNT_NAME} \
    --account-key ${STORAGE_ACCOUNT_KEY} \
    --name ${SHARE_NAME} \
    --quota 1024 \
    --output none

Azure PortalでStorage Account:makiazurefilesdemodemoshareというFile Shareができていることを確認できます。

image

Demoアプリのデプロイ

Demoアプリとして https://github.com/making/demo-uploader を使います。Spring Bootで実装されたシンプルなFile Uploaderです。

Marketplaceの確認

cf marketplacesmbサービスが利用できることを確認してください。

$ cf marketplace
Getting services from marketplace in org demo / space demo as makingx@gmail.com...
OK

service          plans      description                                                                    broker
app-autoscaler   standard   Scales bound applications in response to load                                  app-autoscaler
smb              Existing   Existing SMB shares (see: https://code.cloudfoundry.org/smb-volume-release/)   smbbroker

TIP: Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.

アプリケーションのビルド

git clone https://github.com/making/demo-uploader
cd demo-uploader
./mvnw clean package -DskipTests=true

アプリケーションのデプロイ

cf push demo-uploader -p target/demo-uploader-0.0.1-SNAPSHOT.jar --no-start
cf create-service smb Existing demo-smb -c "{\"share\": \"//${STORAGE_ACCOUNT_NAME}.file.core.windows.net/${SHARE_NAME}\", \"version\": \"3.0\"}"
cf bind-service demo-uploader demo-smb -c "{\"username\": \"${STORAGE_ACCOUNT_NAME}\", \"password\": \"${STORAGE_ACCOUNT_KEY}\"}"
cf start demo-uploader

cf env demo-uploaderの結果は次のようになります。

image

環境変数VCAP_SERVICESの中のsmb内に次の要素が含まれています。

    "volume_mounts": [
     {
      "container_dir": "/var/vcap/data/b96daab0-24ab-4912-8736-3fabdb82a9c6",
      "device_type": "shared",
      "mode": "rw"
     }
    ]

container_dirがコンテナ内にマウントされたSMBのディレクトリです。

アプリケーションがこのディレクトリにファイルを書き込めば、コンテナが再起動してもファイルは失われません。

この値は、

  • Spring Boot 2.2以上では${vcap.services.<SERVICE_INSTANCE_NAME>[volume_mounts][0][container_dir]}
  • Spring Boot 2.1以下では${vcap.services.<SERVICE_INSTANCE_NAME>.volume_mounts[0].container_dir}

参照できます。

Spring Boot以外の場合は、.profile内でjqコマンドを使ったり、echo $VCAP_SERVICES | awk "match(\$0, /\/var\/vcap\/data\/([0-9a-z\-]+)/){print substr(\$0, RSTART,RLENGTH)}"で取得した値を環境変数で設定することになります。

demo-uploaderでは次のように使用しています。
https://github.com/making/demo-uploader/blob/master/src/main/resources/application.properties#L1

demo-uploaderからファイルをアップロードします。

image

demoshare File Shareにファイルが出来ていることが確認できます。

image

cf restart demo-uploader

してもこのファイルは消えません。


✒️️ Edit  ⏰ History  🗑 Delete