Azure Container InstanceでSpring Batchのアプリを動かす(3)Azure ファイル共有をマウントする

Azure Container InstanceでSpring Batchのアプリを動かすことをやっています。過去の内容は以下を参照してください。

このSpring Batchアプリはクラスパス内に置いたCSVファイルを読み取ってデータベースに追記する処理を行います。CSVファイルがクラスパス内にあるのはあまり使い勝手が良くないので、外出しすることを考えます。

そこで使えるのがAzureファイル共有です。Azure Container Instanceは以下のドキュメント通りAzureファイル共有をマウントすることができます。

docs.microsoft.com

ここではこの機能を使ってCSVファイルをAzureファイル共有から読み取るようにします。

準備

Terraformを使ってAzure Container InstanceでAzureファイル共有をマウントすることを実装します。まず、ファイル共有を作成します。

# Storage Accountの作成
resource "azurerm_storage_account" "sa" {
  account_replication_type = "LRS"
  account_tier             = "Standard"
  location                 = data.azurerm_resource_group.rg.location
  name                     = var.storage_account_name
  resource_group_name      = data.azurerm_resource_group.rg.name
}

# File Shareの作成
resource "azurerm_storage_share" "ss" {
  name                 = var.file_share_name
  storage_account_name = azurerm_storage_account.sa.name
  quota                = 10
}

このデータを使ってAzure Container Instanceにマウントします。volumeブロックに必要事項を記述すればOKです。

resource "azurerm_container_group" "aci" {
  location            = data.azurerm_resource_group.rg.location
  name                = var.aci_name
  os_type             = "linux"
  resource_group_name = data.azurerm_resource_group.rg.name
  # 省略

  container {
    cpu    = 0.5
    image  = "${data.azurerm_container_registry.acr.login_server}/batch_processing:latest"
    memory = 1.5
    name   = "miyohidebatchapp"
    # 省略

    # File Volumeの設定
    volume {
      mount_path = "/opt/batchapp"
      name       = "filesharevolume"
      read_only  = false
      share_name = azurerm_storage_share.ss.name
      storage_account_name = azurerm_storage_account.sa.name
      storage_account_key = azurerm_storage_account.sa.primary_access_key
    }
  }
}

このTerraformを実行すると、以下のようにファイル共有がマウントされます。

f:id:miyohide:20211003170259p:plain

動作確認

プログラムの修正

読み込むCSVファイルのパスを修正します。これまでは、以下のようにClassPathResourceメソッドを使っていましたが、

    @Bean
    public FlatFileItemReader<Person> reader() {
        return new FlatFileItemReaderBuilder<Person>()
                .name("personItemReader")
                .resource(new ClassPathResource("sample-data.csv"))
                .delimited()
                .names("firstName", "lastname")
                .fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
                    setTargetType(Person.class);
                }})
                .build();
    }

代わりにFileSystemResourceメソッドを使います。上記のTerraformにおいてmount_path/opt/batchappにしましたので、その直下にsample-data.csvにあるファイルを読み込ませることにします。

    @Bean
    public FlatFileItemReader<Person> reader() {
        return new FlatFileItemReaderBuilder<Person>()
                .name("personItemReader")
                .resource(new FileSystemResource("/opt/batchapp/sample-data.csv"))
                .delimited()
                .names("firstName", "lastname")
                .fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
                    setTargetType(Person.class);
                }})
                .build();
    }

読み込むファイルの内容の修正

読み込むファイルの内容に変化を加えて、マウントしたファイル共有からファイルを読み込んでいることを確認します。

Jill,Doe
Joe,Doe
Justin,Doe
Jane,Doe
John,Doe
Atsushi,Nohmi
Kyuji,Fujikawa
Takashi,Toritani

最後3行追加しています。

ファイルをアップロード

修正したファイルをファイル共有にアップロードします。

f:id:miyohide:20211003170209p:plain

実行する

Azure Container Instanceを動かしてログを確認すると、無事追加したデータが処理されていることがわかります。

f:id:miyohide:20211003170533p:plain

ソース

ここまでのソースは以下の通りです。

github.com