Azure Container InstanceでSpring Batchのアプリを動かすことをやっています。過去の内容は以下を参照してください。
- Azure Container InstanceでSpring Batchのアプリを動かす(2) - miyohide's blog
- Azure Container InstancesでSpring Batchのアプリを動かす - miyohide's blog
このSpring Batchアプリはクラスパス内に置いたCSVファイルを読み取ってデータベースに追記する処理を行います。CSVファイルがクラスパス内にあるのはあまり使い勝手が良くないので、外出しすることを考えます。
そこで使えるのがAzureファイル共有です。Azure Container Instanceは以下のドキュメント通りAzureファイル共有をマウントすることができます。
ここではこの機能を使って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を実行すると、以下のようにファイル共有がマウントされます。
動作確認
プログラムの修正
読み込む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行追加しています。
ファイルをアップロード
修正したファイルをファイル共有にアップロードします。
実行する
Azure Container Instanceを動かしてログを確認すると、無事追加したデータが処理されていることがわかります。
ソース
ここまでのソースは以下の通りです。