Azure FunctionsのHTTPトリガーでBlob Storageにある画像を表示する(Azure Functions v1、Python 3.6.1)の続きです。
前の記事では、Blobへのアクセスができる状態でしたので、SASを生成して一時的にアクセス権限を付与し、ダウンロード表示させるようにしましょう。
Blobのアクセスレベルの変更
対象のコンテナにチェックを入れ、アクセスレベルを変更します
をクリックします。
前の記事ではBlobへのアクセスを許可していましたが、プライベートに変更します。
Function Appの関数を作成
SASを生成(1時間のアクセス許可)し、SASトークンを含むSAS URLをHTMLタグに入れることで、画像を表示します。
import os
import json
from datetime import datetime, timedelta, timezone
from azure.storage.blob import BlockBlobService
from azure.storage.blob import ContainerPermissions
import requests
import base64
account_name = '{your-storage-account}'
account_key = '{your-storage-account-key}'
container_name = 'test'
service = BlockBlobService(account_name=account_name, account_key=account_key)
sas_token = service.generate_container_shared_access_signature(container_name, ContainerPermissions.READ, datetime.utcnow() + timedelta(hours=1))
print (sas_token)
blobs = service.list_blobs(container_name)
files = []
for blob in blobs:
files.append(blob.name)
# response HTML
def write_http_response(status, body):
return_dict = {
"status": status,
"body": body,
"headers": {
"Content-Type": "text/html"
}
}
output = open(os.environ['res'], 'w')
output.write(json.dumps(return_dict))
sas_url = "https://{your-storage-account}.blob.core.windows.net/" + container_name + "/" + files[0] + "?"+ sas_token
write_http_response(200, "<html><h1>" + files[0] + "</h1><img src=" + "\"" + sas_url + "\"" + ">" + "</html>")
下記でも表示できます。requestsでSAS URLから画像をダウンロードした後、HTMLタグにbase64エンコードした画像データを入れています。
ret = requests.get("https://{your-storage-account}.blob.core.windows.net/" + container_name + "/" + files[0] + "?"+ sas_token)
print(ret)
# response HTML base64 binary
def write_http_response(status, body):
return_dict = {
"status": status,
"body": body,
"headers": {
"Content-Type": "text/html"
}
}
output = open(os.environ['res'], 'w')
output.write(json.dumps(return_dict))
ret = requests.get("https://{your-storage-account}.blob.core.windows.net/" + container_name + "/" + files[0] + "?"+ sas_token)
print(ret)
img = base64.b64encode(ret.content)
write_http_response(200, "<html><h1>" + files[0] + "</h1><img src=" + "\"data:image/jpg;base64," + img.decode() + "\"" + ">" + "</html>")
前の記事同様に、保存して実行、関数のURLからlena.jpgが表示されたらOKです。
まとめ
- SAS URLを用いて画像をダウンロードして表示しました
- Function AppのAPI keyをユーザーごとに発行したいですね