📌

Azure Data FactoryでBlobにコピーを使わずファイルを作成する

2023/07/11に公開

はじめに

ADFやSynapse Pipelineでファイルの加工をやっていると単純にファイルだけBlob上に作成したくなることはないでしょうか。
目的は色々あるかと思いますが、多くの場合他の手段の方が合理的なのだろうと思いながらもどうしてもファイルを作成したいときにのために手順を残します。

やること

ADFからREST APIを利用してBlob上にファイルを作成します。
REST APIを叩くためにアプリ登録を事前にしておきます。当然ですが、アプリ登録したあとはストレージアカウントなどに対して書き込み権限を付与する必要があります。
https://learn.microsoft.com/ja-jp/graph/toolkit/get-started/add-aad-app-registration

Blobにファイルを作成する

パイプライン

今回はWebアクティビティを2つ使用してファイルを作成します。
最初のアクティビティでTokenをゲットし、それを使ってファイルを作成します。

変数設定

変数としては次のものを用意しました。環境に応じて変更してください。
ここではSecretも変数としていますが本番利用の際はくれぐれも埋め込まないようにしてください。

Token取得

URL
@concat('https://login.microsoftonline.com/',
 variables('vTenantID'),
 '/oauth2/token'
)
Body
@concat('grant_type=client_credentials&client_id=',
 variables('vClientID'),
 '&client_secret=',
 variables('vClientSecret'),
 '&resource=https://storage.azure.com/'
)

ヘッダには以下を設定。

Content-Type: application/x-www-form-urlencoded

Token取得はこの辺を参考に。
https://learn.microsoft.com/ja-jp/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow#first-case-access-token-request-with-a-shared-secret

https://learn.microsoft.com/ja-jp/azure/storage/blobs/authorize-access-azure-active-directory#microsoft-authentication-library-msal

ファイル作成

URL
@concat('https://',
 variables('vStorageAccountName'), '.blob.core.windows.net/',
 variables('vContainerName'), '/',
 variables('vDirectoryName'), '/',
 'putblob01-', utcNow('yyyyMMdd_hhmmss'),'.txt'
)

ヘッダには以下の値を設定します。Authorizationには、GetTokenの出力からaccess_tokenを利用します。

x-ms-version: 2020-10-02
x-ms-date: @utcNow('R')
x-ms-blob-type: BlockBlob
Authorization: @concat('Bearer ', activity('GetToken').output.access_token)

詳細はこちらを参考に。
https://learn.microsoft.com/ja-jp/rest/api/storageservices/put-blob?tabs=azure-ad

結果

こんな感じでBlob上にファイルが出来上がります。

Discussion