Azure Storage にストレージされているコンテナをAzure Functionsを使って取得する

コンテナの状態をみて最終更新日時から1週間たっていたら定期削除を行いたい。
まずはコンテナを取得してみる。
自分の備忘録として残す。

## Functions

Azure PortalからAzure Storageを作成しておく（後で使うので接続文字列コピーしておく）。
Azure Portalから発行先のAzure Functionsを作成しておく。
新規プロジェクト作成する。

### ソリューションのパッケージの監理

以下インストールしておく。

- Microsoft.Azure.Storage.Blob

### 変数用意

``` C#
        private readonly string storageConnectionString;
        private CloudStorageAccount storageAccount;
        private CloudBlobClient blobClient;
```

環境変数をセット。  

今回はAzure Blob Storageに接続したいので、作成したBlob Storageの接続文字列を設定する。  
環境変数はAzure Portalから作成したFunctionsのアプリケーション設定に値をセットすることで設定できる。  

```C#
public Function1()
        {
            storageConnectionString = Environment.GetEnvironmentVariable("ConnectionStrings:StorageConnectionString", EnvironmentVariableTarget.Process);
        }
```

``` json:local.setting.json
{
    "ConnectionStrings": {
        "StorageConnectionString": "接続文字列"
    }
}
```
デプロイ先のFunction Appのアプリケーション設定で接続文字列の設定をしておく

### Blobに接続する

セットした接続文字列を使用して接続する関数を用意。

```C#
public void SetUp()
        {
            storageAccount = CloudStorageAccount.Parse(storageConnectionString);
            blobClient = storageAccount.CreateCloudBlobClient();
        }
```

### コンテナリストを取得する

コンテナリストを取得する。

``` C#
private static async Task<IEnumerable<CloudBlobContainer>> GetListContainersAsync(CloudBlobClient blobClient)
        {
            BlobContinuationToken continuationToken = null;
            var containers = new List<CloudBlobContainer>();

            do
            {
                ContainerResultSegment response = await BlobClient.ListContainersSegmentedAsync(continuationToken);
                continuationToken = response.ContinuationToken;
                containers.AddRange(response.Results);

            } while (continuationToken != null);

            return containers;
        }
```

## 実際のコード

下記コードによりコンテナリストを取得できる。
これにより、Storage BlobにストレージされているBlobの状態を参照できる。  
状態を参照することにより、Blobの定期削除などが行えるようになる。  

```C#
public class Function1
    {
        private readonly string storageConnectionString;
        private CloudStorageAccount storageAccount;
        private CloudBlobClient blobClient;

        public Function1()
        {
            storageConnectionString = Environment.GetEnvironmentVariable("ConnectionStrings:StorageConnectionString", EnvironmentVariableTarget.Process);
        }

        [FunctionName("Function1")]
        public async Task RunAsync([TimerTrigger("0 0 0 * * *")]TimerInfo myTimer, ILogger log)
        {
            SetUp();

            //コンテナリストを取得
            var containers = await GetListContainersAsync(blobClient);
        }

        public void SetUp()
        {
            storageAccount = CloudStorageAccount.Parse(storageConnectionString);
            blobClient = storageAccount.CreateCloudBlobClient();
        }

        private static async Task<IEnumerable<CloudBlobContainer>> GetListContainersAsync(CloudBlobClient blobClient)
        {
            BlobContinuationToken continuationToken = null;
            var containers = new List<CloudBlobContainer>();

            do
            {
                ContainerResultSegment response = await blobClient.ListContainersSegmentedAsync(continuationToken);
                continuationToken = response.ContinuationToken;
                containers.AddRange(response.Results);

            } while (continuationToken != null);

            return containers;
        }
    }
```

## 最後

次回、コンテナの削除処理のほうををやってみる。