Azure FunctionsのHTTPトリガーでBlob Storageにある画像をSAS URLからダウンロードして表示する（Azure Functions v1、Python 3.6.1）

[Azure FunctionsのHTTPトリガーでBlob Storageにある画像を表示する（Azure Functions v1、Python 3.6.1）](https://qiita.com/SatoshiGachiFujimoto/items/ac6426e949267a78f914)の続きです。

前の記事では、Blobへのアクセスができる状態でしたので、SASを生成して一時的にアクセス権限を付与し、ダウンロード表示させるようにしましょう。

## Blobのアクセスレベルの変更

対象のコンテナにチェックを入れ、`アクセスレベルを変更します`をクリックします。
<img width="829" alt="azure27.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/8eede1c8-4f50-64aa-a18e-ed491e3acda8.png">

前の記事ではBlobへのアクセスを許可していましたが、プライベートに変更します。
<img width="427" alt="azure28.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/70f39e74-fec4-1841-522e-9e9259400ed2.png">

これで、BlobのURLからアクセスしても表示できません。
<img width="664" alt="azure29.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/b5d89bfa-7559-b1b2-9dcb-9267299ae92c.png">

## Function Appの関数を作成

SASを生成（1時間のアクセス許可）し、SASトークンを含むSAS URLをHTMLタグに入れることで、画像を表示します。

~~~python
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エンコードした画像データを入れています。

~~~python
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をユーザーごとに発行したいですね

## 参考文献
- [Azure Functions の API Key を扱ってみる](https://tech.guitarrapc.com/entry/2016/04/22/042331)