[アップデート] AppStream 2.0でLinuxイメージがサポートされました

2021.11.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

先日の話ですがAmazon AppStream 2.0で従来のWindows Serverイメージ以外にAmazon Linux 2ベースのイメージが使える様になりました。
AWSからのアナウンスは以下となります。

類似サービスのAmazon WorkSpacesでは以前からLinuxイメージが使えましたがAppStream 2.0はWindows Serverイメージのみのサポートでした。
今回の更新によりユーザーに新しい選択肢が増える形となります。

試してみた

早速ですが試していきます。

今回は私の検証アカウントを使い東京リージョンで試しています。
VPC環境は予め準備済みのものを使っています。

1. イメージの選択

はじめにImage registryに登録されているイメージを検索すると下図の様にAmazon Linux 2ベースのイメージが増えていることが分かります。

それぞれ

  • AppStream-AmazonLinux2-11-15-2021 : 基本イメージ
  • AppStream-Graphics-G4dn-AmazonLinux2-11-15-2021 : グラフィックG4 (NVIDIA GPU利用)向けイメージ
  • AppStream-Graphics-Pro-AmazonLinux2-11-15-2021 : グラフィックPro向けイメージ

となり、今回はAppStream-AmazonLinux2-11-15-2021を試していきます。

2. Image Builder の確認

次にこのイメージをベースにImage Builderを設定します。
ざっくり下図の様な感じでインスタンスタイプはstream.standard.mediumにしています。

出来上がりはこんな感じなりますので「Connect」ボタンをクリックしてインスタンス内部にログインしてみます。

イメージ内部のデスクトップはGNOME 3 *1を使っており非常にシンプルな感じです。

右上の「Applications」欄をクリックするとランチャーが起動し各種アプリケーションを選択することができます。

3. 公開アプリケーション設定

このイメージを使って公開アプリケーション設定を行うわけですが、Windows Serverイメージの場合は「Image Assitant」という専用のGUIアプリケーションを使いましたがLinux環境ではAppStreamImageAssistantというCLIアプリケーションを使います。

今回は以下のチュートリアルに従いChromiumブラウザを追加インストールし公開する手順をやってみます。

ここからの作業は「Terminal」アプリを起動しターミナル上で行います。
実行ユーザーはログインしているImageBuilderAdminになります。

3-1. Chromiumのインストール

はじめにYumを使いChromium(chromium.x86_64)をインストールします。(要インターネットアクセス)
Amazon Linux 2にはデフォルトで日本語フォントが無かったので追加でIPAのフォントもインストールしておきます。

# Chromiumのインストール
sudo yum update && sudo yum install chromium.x86_64

# 今回は追加でIPAの日本語フォントをインストールしておく
sudo yum install ipa-gothic-fonts ipa-mincho-fonts

インストール後Chromiumが起動できればOKです。

3-2. マニフェストファイルの作成

次にアプリケーションの起動を最適化するためのマニフェストファイルを作ります。
この手順は公開したいアプリケーションを起動した状態で行う必要があります。

Chromiumを起動した状態でアプリケーションのプロセスIDを取得します。
AWSのドキュメントではpsコマンドの結果から親プロセスを探す手順を採っていますが、その他のアプリケーションの場合はよしなに行ってください。

# psコマンドを使い chromium のプロセスIDを探す。
# chromiumはマルチプロセスで動くアプリケーションのため一番親のプロセスIDを探す
ps -ef | grep chromium

同時に以下の内容のシェルスクリプトファイル(~/getfilestool.sh)を用意し実行可能にしておきます。

~/getfilestool.sh

#!/bin/bash
## usage getfilestool.sh $pid
lsof -p $(pstree -p $1 | grep -o '([0-9]\+)' | grep -o '[0-9]\+' | tr '\012' ,)|grep REG | sed -n '1!p' | awk '{print $9}'|awk 'NF'

用意したシェルスクリプトファイルの引数にChromiumのプロセスIDを指定して実行します。

# 今回の環境ではChromiumのプロセスIDは 8186 だった。引数は環境によって変える
sudo ~/getfilestool.sh 8186 > /tmp/chromium-manifest.txt

/tmp/chromium-manifest.txtが作成されていればOKです。
内容としてはこんな感じでプロセスによりロードされるファイルのリストになります。

/tmp/chromium-manifest.txt

/usr/lib64/libX11-xcb.so.1.0.0
/usr/lib64/chromium-browser/swiftshader/libGLESv2.so
/usr/lib64/chromium-browser/resources.pak
/usr/lib64/chromium-browser/chrome_200_percent.pak
/usr/lib64/chromium-browser/icudtl.dat
/usr/lib/locale/locale-archive
/usr/lib64/libgraphite2.so.3.0.1
/usr/lib64/libelf-0.176.so
/usr/lib64/libattr.so.1.1.0

・・・中略・・・

/usr/lib64/librt-2.26.so
/usr/lib64/libpthread-2.26.so
/usr/lib64/libdl-2.26.so
/usr/lib64/ld-2.26.so
/usr/lib64/chromium-browser/chrome_100_percent.pak
/usr/lib64/chromium-browser/chrome_200_percent.pak
/usr/lib64/chromium-browser/locales/en-US.pak
/usr/lib64/chromium-browser/resources.pak

3-3. アプリケーションカタログの追加

ここでAppStreamImageAssistantコマンドを使い以下の様にAppStreamImageAssistant add-applicationコマンドを実行します。

前項で取得したマニフェストファイルは--absolute-manifest-pathで指定してやります。
その他のパラメーターは実際のアプリケーションに合わせて設定してやります。

# 公開アプリケーションの登録
sudo AppStreamImageAssistant add-application \
    --name "Chromium" \
    --absolute-app-path "/usr/lib64/chromium-browser/chromium-browser" \
    --display-name "Chromium" \
    --absolute-icon-path "/usr/share/icons/hicolor/256x256/apps/chromium-browser.png" \
    --absolute-manifest-path "/tmp/chromium-manifest.txt"

エラー無くコマンドが成功すればOKです。

AppStreamImageAssistant list-applicationsコマンドで登録内容を確認できます。

# 登録されているアプリケーションの確認
$ sudo AppStreamImageAssistant list-applications
{
  "status": 0,
  "message": "Success",
  "applications": [
    {
      "Name": "Chromium",
      "AbsoluteAppPath": "/usr/lib64/chromium-browser/chromium-browser",
      "DisplayName": "Chromium",
      "AbsoluteIconPath": "/usr/share/icons/hicolor/256x256/apps/chromium-browser.png",
      "AbsoluteManifestPath": "/opt/appstream/AppCatalogHelper/AppManifests/5770c4ca-fa84-4c08-afe2-189716283eef.txt"
    }
  ]
}

また、今回は行いませんがアプリケーションを削除したい場合はAppStreamImageAssistant remove-applicationコマンドを使います。

3-4. デフォルト設定、デフォルト環境変数の設定

Linuxイメージでは公開アプリケーションのデフォルト設定を/etc/skel/配下に保存します。
まずは最初に以下のディレクトリを作成します。

sudo mkdir /etc/skel/.config

次にこのディレクトリ配下にデフォルトにしたい設定をコピーします。
Chromiumの場合は以下の様にします。

# Chromiumの設定 ~/.config/chromium をコピー。事前にChromiumの設定変更をしておくこと
sudo cp -R ~/.config/chromium /etc/skel/.config

ちなみに今回はチュートリアルの内容に倣いホームページ設定を変更しておきました。

また、今回は使用しませんがデフォルト環境変数を設定したい場合は/etc/profile.d/に任意のシェルスクリプトファイルを作成しその中で環境変数を設定してやります。
チュートリアルではmyenvvars.shというスクリプトファイルを作っていました。

# デフォルト環境変数の設定例
echo "export MyENV=MyVAL" | sudo tee -a /etc/profile.d/myenvvars.sh
sudo chmod +x /etc/profile.d/myenvvars.sh

3-5. 動作確認

Windows Serverイメージの場合はImage Builderのログイン時にテストユーザーによるログインを選択できましたが、Linuxイメージではテストユーザーは用意されていません。
自分でテスト用ユーザーを作成し動作確認した後にそのユーザーを削除する手順となっています。

チュートリアルの内容に従うと以下の様な手順を踏む形となります。

# テスト用ユーザーを作成。パスワードは適当に
sudo useradd -m test-user
echo -e 'Pa55w0rdas2!!!\nPa55w0rdas2!!!\n' | sudo passwd test-user

# テスト用ユーザーにスイッチ
su - test-user

# テストを実施 : 環境変数を確認したり、Chromiumを起動したりする

# テストが終わったらログアウトしテスト用ユーザーを削除する
logout
sudo killall -u test-user
sudo userdel -r test-user

3-6. イメージの作成

これでアプリケーションの準備は完了したので実際のイメージを作成します。

イメージ作成はsudo AppStreamImageAssistant create-imageコマンドで行います。
細かいパラメーターはsudo AppStreamImageAssistant create-image --helpコマンドで確認できますが、ざっくり以下の様な感じで可能です。

sudo AppStreamImageAssistant create-image \
   --name "my-al2-image" \
   --display-name "My Amazon Linux 2 Image" \
   --description "My Amazon Linux 2 Image" \
   --use-latest-agent-version

コマンドに成功すると自動でImage Builderからログオフされイメージ作成が開始されます。

出来上がったイメージはこんな感じになります。

4. Fleet、Stack作成

FleetおよびStackの作成は従来通り変わりありません。
ただし、Linuxイメージでは

  • Active Directory連携
  • アプリケーション設定の永続化

はサポートされていませんのでご注意ください。

あとはユーザーを作成しStackと紐づければ完了です。

5. 公開アプリケーションの利用

今回はWindowsのネイティブアプリから公開アプリケーションを利用してみます。
AppStream 2.0環境にログインすると下図の様な感じになります。

Windows版と特に変わりなくChromiumが公開されてくれました。
Chromiumを起動するとこんな感じです。

残念ながらネイティブアプリケーションモードはサポートされていませんでした。

加えてFleetの表示を「Desktop View」に変えた場合はこんな感じになります。

ログインユーザーはas2-streaming-userでImage Builderと同様にGNOME 3のデスクトップを利用できる様になります。

最後に

以上となります。

AWSとしてはLinuxイメージを用意することでより低コストにアプリケーションストリーミング環境を提供することを意図している様です。
実際利用者の立場としてもより低コストなオプションが増えることは嬉しい限りですので、AppStream 2.0を使う際には積極的に選択肢に入れると良いと思います。

脚注

  1. このイメージではGNOME 3.28.2でした