Directory APIがやってきた記念!Amazon WorkSpacesをAWS CLIで作成してみました。

記事タイトルとURLをコピーする

こんにちは、技術4課の城です。
先日、Directory APIがついにやってきました
例えば、Amazon WorkSpacesをAWS CLIで構築しようとした際、Directory Serviceを構築した後にWorkSpacesに利用するDirectory Serviceの登録をする必要があるのですが、これまではAPIが提供されていなかったため、どうしてもマネジメントコンソールで対応する必要がありました。
今後はこの作業もAWS CLIで対応できるようになったわけです。

というわけでAmazon WorkSpacesをAWS CLIで作ってみましょう!

1.前提条件

WorkSpaces用のVPC及び、サブネット2つ(異なるAvailability Zone)は作成済みであること。
今回は10.0.0.0/16のVPC、10.0.0.0/24、10.0.1.0/24のサブネットを用意しました。
クライアントはWSLのUbuntu18.04を使っています。

2.今回のゴール

Simple ADを使ったWorkSpacesを1台作成します。
では手順に入っていきます。

3.AWS CLIのアップグレード

AWS CLIの最新バージョンへアップグレードします。

pip3 install awscli --upgrade --user

まだインストールされてないよー、という方については下記リンク先ドキュメントをご参考ください。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html

4.プロファイルの設定

利用するアカウントのプロファイルを環境変数に設定します。
【コマンド】

export AWS_DEFAULT_PROFILE=********

AWS CLIの名前付きプロファイルの設定については下記をご覧ください。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html

5.Simple ADの作成

5.1 変数の設定

パラメータを変数として設定します。
【コマンド】

# Active Directoryのドメイン名(Directory DNS)
SIMPLE_AD_NAME='corp.example.local'

# NetBIOS名
SIMPLE_AD_SHORTNAME='CORP'

# ドメインAdministrator パスワード
SIMPLE_AD_PASSWORD='********'

# Description
SIMPLE_AD_DESC='for test'

# Directory Size
SIMPLE_AD_SIZE='Small'

# VPCのCIDR
VPC_CIDR='10.0.0.0/16'

# サブネットのCIDR
SUBNET1_CIDR='10.0.0.0/24'
SUBNET2_CIDR='10.0.1.0/24'

5.2 VPC IDの取得

【コマンド】

VPC_ID=$( \
  aws ec2 describe-vpcs \
    --filters --filters Name=cidrBlock,Values=${VPC_CIDR} \
    --query 'Vpcs[].VpcId' \
    --output text \
) \
&& echo ${VPC_ID}

【結果例】

vpc-*****************

5.3 サブネットIDの取得

【コマンド】

SUBNET1_ID=$( \
  aws ec2 describe-subnets \
    --filters --filters Name=cidrBlock,Values=${SUBNET1_CIDR} \
    --query 'Subnets[].SubnetId' \
    --output text \
) \
&& echo ${SUBNET1_ID}

【結果例】

subnet-*****************

【コマンド】

SUBNET2_ID=$( \
  aws ec2 describe-subnets \
    --filters --filters Name=cidrBlock,Values=${SUBNET2_CIDR} \
    --query 'Subnets[].SubnetId' \
    --output text \
) \
&& echo ${SUBNET2_ID}

【結果例】

subnet-*****************

5.4 変数の確認

【コマンド】

cat << ETX

  AWS_DEFAULT_PROFILE: ${AWS_DEFAULT_PROFILE}
  SIMPLE_AD_NAME:      ${SIMPLE_AD_NAME}
  SIMPLE_AD_SHORTNAME: ${SIMPLE_AD_SHORTNAME}
  SIMPLE_AD_PASSWORD:  ${SIMPLE_AD_PASSWORD}
  SIMPLE_AD_DESC:      ${SIMPLE_AD_DESC}
  SIMPLE_AD_SIZE:      ${SIMPLE_AD_SIZE}
  VPC_ID:              ${VPC_ID}
  SUBNET1_ID:          ${SUBNET1_ID}
  SUBNET2_ID:          ${SUBNET2_ID}

ETX

【結果例】

  AWS_DEFAULT_PROFILE: ********
  SIMPLE_AD_NAME:      corp.example.local
  SIMPLE_AD_SHORTNAME: CORP
  SIMPLE_AD_PASSWORD:  ********
  SIMPLE_AD_DESC:      for test
  SIMPLE_AD_SIZE:      Small
  VPC_ID:              vpc-*****************
  SUBNET1_ID:          subnet-*****************
  SUBNET2_ID:          subnet-*****************

5.5 Simple ADの構築

【コマンド】

aws ds create-directory \
  --name ${SIMPLE_AD_NAME} \
  --short-name ${SIMPLE_AD_SHORTNAME} \
  --password ${SIMPLE_AD_PASSWORD} \
  --description "${SIMPLE_AD_DESC}" \
  --size ${SIMPLE_AD_SIZE} \
  --vpc-settings "VpcId=${VPC_ID},SubnetIds=${SUBNET1_ID},${SUBNET2_ID}" \
| tee simple-ad.json 

※出力を事項のDirectory IDの取得に使いたいため、teeコマンドへパイプしています。

【結果例】

{
    "DirectoryId": "d-**********"
}

5.6 Directory IDの取得

【コマンド】

DIRECTORY_ID=$( \
  cat simple-ad.json | jq -r '.DirectoryId' \
) \
&& echo ${DIRECTORY_ID}

【結果例】

d-**********

5.7 Directoryのステータス確認

Activeが返ってくればOKです。
Creatingの場合は少し待ちましょう。

【コマンド】

aws ds describe-directories \
  --directory-ids ${DIRECTORY_ID} \
  --query 'DirectoryDescriptions[].Stage' \
  --output text

6.Directoryの登録

お待ちかねのDirectoryの登録になります。
下記リファレンスを参考にコマンド実行してみます。
https://docs.aws.amazon.com/cli/latest/reference/workspaces/register-workspace-directory.html
今回はWorkDocsは無効、セルフサービス管理機能は有効にしてみました。

【コマンド】

aws workspaces register-workspace-directory \
  --directory-id ${DIRECTORY_ID} \
  --no-enable-work-docs \
  --enable-self-service

【結果】
戻り値無し

サクッと登録されました。

7.WorkSpacesの構築

それではWorkSpacesを構築していきます。

7.1 変数の設定

必要なパラメータを変数として設定します。

【コマンド】

# ユーザー名
USER_NAME='jo'

# Cドライブの暗号化
ROOTVOL_ENCRYPTION='false'

# Dドライブの暗号化
USERVOL_ENCRYPTION='false'

# 実行モード
RUNNING_MODE='AUTO_STOP'

# 実行モードがAutoStopの場合に自動停止する時間(単位は分)
AUTO_STOP_TIMEOUT_MINUITES='60'

# Cドライブのサイズ(GB)
ROOTVOL_SIZE='80'

# Dドライブのサイズ(GB)
USERVOL_SIZE='10'

# コンピュータータイプ
COMPUTER_TYPE='STANDARD'

# タグ
TAG_KEY1='Name'
TAG_VALUE1='jo'

# バンドルID ※事前にマネジメントコンソールで適切なものを検索、用意してください
BUNDLE_ID='wsb-7dmn3zpyr'

# WorkSpace設定出力ファイル
FILE_PARAMATER=workspaces-${USER_NAME}.json

7.2 変数の確認

【コマンド】

cat << ETX

  AWS_DEFAULT_PROFILE:         ${AWS_DEFAULT_PROFILE}
  USER_NAME:                   ${USER_NAME}
  ROOTVOL_ENCRYPTION:          ${ROOTVOL_ENCRYPTION}
  USERVOL_ENCRYPTION:          ${USERVOL_ENCRYPTION}
  RUNNING_MODE:                ${RUNNING_MODE}
  AUTO_STOP_TIMEOUT_MINUITES:  ${AUTO_STOP_TIMEOUT_MINUITES}
  ROOTVOL_SIZE:                ${ROOTVOL_SIZE}
  USERVOL_SIZE:                ${USERVOL_SIZE}
  COMPUTER_TYPE:               ${COMPUTER_TYPE}
  TAG_KEY1:                    ${TAG_KEY1}
  TAG_VALUE1:                  ${TAG_VALUE1}
  FILE_PARAMATER:              ${FILE_PARAMATER}
  DIRECTORY_ID:                ${DIRECTORY_ID}
  BUNDLE_ID:                   ${BUNDLE_ID}

ETX

【結果例】


  AWS_DEFAULT_PROFILE:         ********
  USER_NAME:                   jo
  ROOTVOL_ENCRYPTION:          false
  USERVOL_ENCRYPTION:          false
  RUNNING_MODE:                AUTO_STOP
  AUTO_STOP_TIMEOUT_MINUITES:  60
  ROOTVOL_SIZE:                80
  USERVOL_SIZE:                10
  COMPUTER_TYPE:               STANDARD
  TAG_KEY1:                    Name
  TAG_VALUE1:                  jo
  FILE_PARAMATER:              workspaces-jo.json
  DIRECTORY_ID:                d-**********
  BUNDLE_ID:                   wsb-7dmn3zpyr

7.3 WorkSpace設定出力ファイルの作成

【コマンド】

cat << ETX > ${FILE_PARAMATER}
{
    "Workspaces": [
        {
            "DirectoryId": "${DIRECTORY_ID}",
            "UserName": "${USER_NAME}",
            "BundleId": "${BUNDLE_ID}",
            "UserVolumeEncryptionEnabled": ${ROOTVOL_ENCRYPTION},
            "RootVolumeEncryptionEnabled": ${USERVOL_ENCRYPTION},
            "WorkspaceProperties": {
                "RunningMode": "${RUNNING_MODE}",
                "RunningModeAutoStopTimeoutInMinutes": ${AUTO_STOP_TIMEOUT_MINUITES},
                "RootVolumeSizeGib": ${ROOTVOL_SIZE},
                "UserVolumeSizeGib": ${USERVOL_SIZE},
                "ComputeTypeName": "${COMPUTER_TYPE}"
            },
            "Tags": [
                {
                    "Key": "${TAG_KEY1}",
                    "Value": "${TAG_VALUE1}"
                }
            ]
        }
    ]
}
ETX
cat ${FILE_PARAMATER}

【結果例】

{
    "Workspaces": [
        {
            "DirectoryId": "d-*********",
            "UserName": "jo",
            "BundleId": "wsb-7dmn3zpyr",
            "UserVolumeEncryptionEnabled": false,
            "RootVolumeEncryptionEnabled": false,
            "WorkspaceProperties": {
                "RunningMode": "AUTO_STOP",
                "RunningModeAutoStopTimeoutInMinutes": 60,
                "RootVolumeSizeGib": 80,
                "UserVolumeSizeGib": 10,
                "ComputeTypeName": "STANDARD"
            },
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "jo"
                }
            ]
        }
    ]
}

7.4 WorkSpaceの作成

残念ながらSimpleADでは現時点(2019/11/28)にてAWS CLIでユーザーを作成することはできないので、マネジメントコンソールにて作成した後に下記コマンドを実行します。

【コマンド】

aws workspaces create-workspaces \
  --cli-input-json file://${FILE_PARAMATER}

【結果例】

{
    "FailedRequests": [],
    "PendingRequests": [
        {
            "WorkspaceId": "ws-*********",
            "DirectoryId": "d-**********",
            "UserName": "jo",
            "State": "PENDING",
            "BundleId": "wsb-7dmn3zpyr",
            "UserVolumeEncryptionEnabled": false,
            "RootVolumeEncryptionEnabled": false
        }
    ]
}

7.5 WorkSpaceのステータス確認

下記コマンドを実行し、ActiveになればOKです。
※PendingからActiveになるのに経験則ではありますが、20分~30分程度かかります。

【コマンド】

aws workspaces describe-workspaces \
  --directory-id ${DIRECTORY_ID} \
  --user-name ${USER_NAME} \
  --query 'Workspaces[].State' \
  --output text

できました!

最後に

一部、マネジメントコンソールで実行する必要はあるものの、Directory APIがサポートされたことでオペレーションする方にとっては嬉しいアップデートだったのではないでしょうか。

どなたかの助けになれば、幸いです。

城 航太 (記事一覧)

サイトリライアビリティエンジニアリング部・CSM課・課長

AWSへの移行、AWSアカウントセキュリティ、ネットワーク広く浅くといった感じです。最近はAmazon WorkSpacesやAmazon AppStream2.0が好きです。APN Ambassador 2019,2020