[小ネタ] Amazon AppStream 2.0のS3に設定されるユーザーIDについて

2022.02.06

しばたです。

AppStream 2.0ではFleetインスタンス使用ユーザーのホームフォルダの内容を所定のS3バケットに保存することが可能です。

このS3バケットはappstream2-36fb080bb8-[リージョン名]-[アカウントID]という名前で自動生成され、このバケット内にユーザー毎のPrefixが割り当てられます。

本記事ではこのユーザー毎のPrefixの割り当てられ方と確認方法を解説します。

ユーザー毎Prefixの割り当てられ方

このS3バケットでは以下の様にPrefixが割り当てられます。

  • バケット名/user/[ユーザー種別]/[ユーザーIDのSHA256ハッシュ値]/

ユーザー種別は以下のパターンに分かれるそうです。

  • ユーザープールの場合 : userpool
  • SAML 2.0 Federated Userの場合 : federated
  • AWS SDKやCLIによる生成の場合 : custom

そして個々のユーザーを分けるPrefixとしてユーザーIDを直接使わずユーザーIDから算出したハッシュ値を使っています。
ドキュメントにある例を出すと、たとえばユーザーIDがSAMPLEDOMAIN\testuserの場合は8dd9a642f511609454d344d53cb861a71190e44fed2B8aF9fde0C507012a9901になるとされています。

このため最終的になPrefixは/user/[ユーザー種別]/8dd9a642f511609454d344d53cb861a71190e44fed2B8aF9fde0C507012a9901/になります。

私が確認した限りではベースとなるユーザーIDは、ユーザープールの場合はメールアドレス、Federated Userの場合はUPNの値が使われていました。
こちらは環境によって異なると思いますのであくまでも一例だとお考えください。

確認方法

AppStream 2.0を運用する中で特定ユーザーの情報を調べる必要があると思います。
その際にハッシュ値の確認方法を覚えておくと若干ですが運用が楽になります。

Linux環境であればsha256sumコマンドを使えばすぐにハッシュ値が算出できます。
以下の様にユーザーIDの値をパイプラインで渡してやればハッシュ値を確認できます。

# 改行を含めない様に -n を入れるのがポイント
$ echo -n "SAMPLEDOMAIN\testuser" | sha256sum
8dd9a642f511609454d344d53cb861a71190e44fed2b8af9fde0c507012a9901  -

Windows環境の場合はsha256sumコマンドは無いものの、PowerShellで簡単な関数を作ってやればsha256sumコマンドと同等の機能を用意できます。

# 文字列のハッシュ値を算出する簡単な関数
function Get-StringHash {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true)]
        [string]$InputValue,
        [ValidateSet('MD5', 'SHA1', 'SHA256', 'SHA384', 'SHA512')]
        [string]$Algorithm = 'SHA256',
        [switch]$ToUpperCase
    )
    begin {
        if ([string]::IsNullOrEmpty($InputValue)) {
            $InputValue = ''
        }
        if ([string]::IsNullOrEmpty($Algorithm)) {
            $Algorithm = 'SHA256'
        }
        $hashAlgorithm = [Security.Cryptography.HashAlgorithm]::Create($Algorithm)
    }
    process {
        $hashBytes = $hashAlgorithm.ComputeHash([Text.Encoding]::UTF8.GetBytes($InputValue))
        if ($ToUpperCase) {
            return [BitConverter]::ToString($hashBytes).Replace('-','')
        }
        return [BitConverter]::ToString($hashBytes).Replace('-','').ToLower()
    }
    end {
        $hashAlgorithm.Dispose()
    }
}

このGet-StringHash関数を使えばsha256sumコマンドと同様にハッシュ値を算出可能です。

# sha256sum コマンドと同じ様な使い勝手
C:\> "SAMPLEDOMAIN\testuser" | Get-StringHash
8dd9a642f511609454d344d53cb861a71190e44fed2b8af9fde0c507012a9901

補足 : Application setting persistenceのS3

ホームフォルダ以外の機能にApplication setting persistence機能で使われるS3バケットも同様のルールとなっています。

こちらの場合バケット名はappstream-app-settings-[リージョン名]-[アカウントID]-[ランダム値]となり、バケットの内部構成は

  • バケット名/windows/v4/[Setting group名]/[ユーザー種別]/[ユーザーIDのSHA256ハッシュ値]/
  • バケット名/windows/v6/Server-2019/[Setting group名]/[ユーザー種別]/[ユーザーIDのSHA256ハッシュ値]/

といった形になります。

このユーザーIDのハッシュ値も同様の方法で確認可能です。

最後に

以上となります。
ちょっとした小技ですが覚えておくとAppStream 2.0の運用が少しだけ楽になるはずです。