Azure FunctionsとAzureのサービスをつなげる方法
2024-06-26
azblob://2024/06/26/eyecatch/2024-06-26-how-to-connect-azure-functions-to-other-service-000.jpg

こんにちは、口分田です。最近はバケットにハマっています。

前回のブログでAzure FunctionsでPlaywrightを動かす方法を書きました。今回は私がAzure Functionsを使っていて、Azureの他のサービスを使う機会がありましたので、その方法を書いていきたいと思います。

今回Azure FunctionsとつなげるAzureのサービスはKey Vaultとストレージアカウント(前回の手順でAzure Functionsのリソースを作ると同時に生成されたもの)です。Key Vaultはクレデンシャルを取得するため、ストレージアカウントは成果物を格納するために用います。各リソースは既にある前提で話を進めます。尚、環境は前回のブログと同様です。また、Azure PortalのAzure Functionsで実行することを想定していますので、今回のブログの通りに行っただけではローカルで実行することはできません。ローカル実行するためのブログも近日公開しますのでそれまでお待ちください。


1. Key Vaultとの連携

まず、下記コマンドをターミナルで実行orDockerfileに書いてください。

npm install @azure/keyvault-secrets
npm install @azure/identity

これらのコマンドは、Node.js 用の Azure Key Vault Secrets、Azure Identity クライアント ライブラリをインストールするコマンドです。@azure/identity パッケージをインストールすることで、Node.js アプリケーションから Azure リソースに安全にアクセスするための認証機能を簡単に実装できます。Azure Identity ライブラリは、Azure Active Directory(AAD)を使用して認証を行うための簡単で安全な方法を提供します。一行目の @azure/keyvault-secrets ライブラリと組み合わせることで、Azure Key Vault へのアクセスを認証し、シークレットを安全に管理することができます。

続いて、Node.js のモジュールの読み込み(インポート)を行います。以下のプログラムをプログラム中の先頭に追加してください。

Javascriptconst { SecretClient } = require("@azure/keyvault-secrets");
const { DefaultAzureCredential } = require('@azure/identity');

これで下準備は完了です。あとはプログラム中でAzure Key Vaultからシークレットを取得します。以下のプログラムを追加してください。

Javascriptconst keyVaultUrl = <Key VaultのURL>
const secretName = <Key Vaultに登録されているシークレット名>;
const credential = new DefaultAzureCredential();
const client = new SecretClient(keyVaultUrl, credential);
const secret = await client.getSecret(secretName);
const password = secret.value;

Key VaultのURLとKey Vaultに登録されているシークレット名は環境変数にするなどの安全な保管方法のものにするとよいでしょう。

三行目はAzure CLI を使用して Azure に認証するための資格情報を作成しています。これにより、Azure CLI を使用して認証することができ、Azure リソースにアクセスできます。

四行目はAzure Key Vault の URL と認証情報を使用して、Key Vault クライアントを作成しています。このクライアントを使用して、Key Vault に保存されているシークレットにアクセスできます。

五行目はKey Vaultからシークレットを取得しています。

六行目は取得したシークレットの値を、変数に格納しています。

これでpasswordという変数を用いて、パスワードを必要なときに使うことが可能になります!

2. ストレージアカウントとの連携

まず、下記コマンドをターミナルで実行orDockerfileに書いてください。

npm install @azure/storage-blob

先ほどと同様に、これはNode.js 用の Azure Storage Blob クライアント ライブラリをインストールするコマンドです。

続いて、Node.js のモジュールの読み込み(インポート)を行います。以下のプログラムをプログラム中の先頭に追加してください。

const { BlobServiceClient } = require('@azure/storage-blob');

プログラム中に下記のように記述してください。今回はPlaywrightでスクリーンショットを取って、ストレージアカウントに格納するようにします。状況に応じて変えてください。

Javascriptconst blobServiceClient = BlobServiceClient.fromConnectionString(<ストレージアカウントの接続文字列>);
const containerName = <コンテナ名>;
const containerClient = blobServiceClient.getContainerClient(containerName);
const screenshotBuffer = await page.screenshot({ type: "png"});
const blobName = `${Date.now()}.png`;
const blockBlobClient = containerClient.getBlockBlobClient(blobName);
await blockBlobClient.upload(screenshotBuffer, screenshotBuffer.length);

一行目は接続文字列を使用して、Azure Blob Storageに接続するクライアントを作成しています。

二行目、三行目はスクリーンショットを保存するコンテナの名前を取得し、containerClient を使用してそのコンテナへの参照を取得しています。

四行目はPlaywright の page.screenshot() メソッドを使用して、現在のページのスクリーンショットを PNG 形式で撮影しています。スクリーンショットは screenshotBuffer というバッファに保存されます。

五行目は一意のブロブ名を生成しています。

六行目は生成したブロブ名を使用して、コンテナ内の新しいブロック BLOB への参照を取得しています。

七行目はscreenshotBuffer に保存されているスクリーンショットデータを、新しく作成したブロック BLOB にアップロードしています。

これでストレージアカウントに保存が完了します!


まとめ

いかがでしたでしょうか。意外と簡単にできるんだと思ったのではないでしょうか。流れさえつかんでしまえば他のAzureのサービスと接続するときも難なくできそうですね!

このブログが読者の皆様の一助になりますと幸いです。