🖥️

Amazon WorkSpaces Webを利用してみる

2023/06/05に公開

Amazon WorkSpaces Webを利用してみる

DevelopersIO BASECAMP参加者の加藤です。

今回は「Amazon WorkSpaces Web」を利用してみたいと思います。

IAM Identity Centerも手順に含まれますのでご興味があればご覧いただければ幸いです。


元のハンズオン

日本語のAWSハンズオンをカテゴリ別にまとめたJP Contents Hub内に元のハンズオン教材があります。

元々は全てテンプレートで完結してみるつもりでしたが、残念ながらIAM Identity CenterやWorkSpaces Webの作業も含めテンプレートだけで完結というのは難しそうでした。

JP Contents Hub>Amazon WorkSpaces Web ワークショップ

実際に作成されない方も手順部分をザッと眺めていただければと思います。
(作成される方は料金がかかりますのでご注意ください。)


作成

VPCコンソールで作成するリソースのテンプレート

このテンプレートをCloudFormationで実行します。
base.yml
AWSTemplateFormatVersion: "2010-09-09"
# ------------------------------------------------------------#
# Metadata
# ------------------------------------------------------------#
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:

      - Label:
          default: Stack
        Parameters:
          - Prefix

      - Label:
          default: VPC
        Parameters:
          - VPCCidrBlock

      - Label:
          default: Subnet
        Parameters:
          - PublicSubnet1aCidrBlock
          - PrivateSubnet1aCidrBlock
          - PrivateSubnet1cCidrBlock
# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------#
Parameters:
  Prefix: 
    Type: String
    MinLength: 1
    MaxLength: 13
    AllowedPattern: "[a-z][a-z0-9]*"
    Default: workapacesweb

  VPCCidrBlock:
    Type: String
    Default: 10.0.0.0/16
    MinLength: 9
    MaxLength: 18
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})

  PublicSubnet1aCidrBlock:
    Type: String
    Default: 10.0.0.0/20
    MinLength: 9
    MaxLength: 18
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})

  PrivateSubnet1aCidrBlock:
    Type: String
    Default: 10.0.128.0/20
    MinLength: 9
    MaxLength: 18
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})

  PrivateSubnet1cCidrBlock:
    Type: String
    Default: 10.0.120.0/20
    MinLength: 9
    MaxLength: 18
    AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})
# ------------------------------------------------------------#
# Resources
# ------------------------------------------------------------#
Resources: 
  # ------------------------------------------------------------#
  # VPC
  # ------------------------------------------------------------#
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCidrBlock
      InstanceTenancy: default
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Sub ${Prefix}-vpc
  # ------------------------------------------------------------#
  # RouteTable
  # ------------------------------------------------------------#
# ルートテーブル
  PublicRTB:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${Prefix}-rtb-public

  PrivateRTB:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${Prefix}-rtb-private-1a

# ルート
  PublicRoute:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PublicRTB
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref IGW

  PrivateRoute1a: 
    Type: AWS::EC2::Route
    Properties: 
      RouteTableId: !Ref PrivateRTB
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: !Ref NGW1a

# アソシエーション
  PublicSN1aAssoc:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet1a
      RouteTableId: !Ref PublicRTB

  PrivateSN1aAssoc: 
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties: 
      SubnetId: !Ref PrivateSubnet1a
      RouteTableId: !Ref PrivateRTB

  PrivateSN1cAssoc: 
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties: 
      SubnetId: !Ref PrivateSubnet1c
      RouteTableId: !Ref PrivateRTB
  # ------------------------------------------------------------#
  # InternetGateway
  # ------------------------------------------------------------#
# IGW
  IGW:
    Type: AWS::EC2::InternetGateway
    Properties: 
      Tags:
        - Key: Name
          Value: !Sub ${Prefix}-igw

# アタッチメント
  IGWAttach:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties: 
      InternetGatewayId: !Ref IGW
      VpcId: !Ref VPC
  # ------------------------------------------------------------#
  # NatGateway
  # ------------------------------------------------------------#
  NGW1a: 
    Type: AWS::EC2::NatGateway
    Properties:
      AllocationId: !GetAtt EIPForNGW1a.AllocationId 
      SubnetId: !Ref PublicSubnet1a
      Tags: 
        - Key: Name
          Value: !Sub ${Prefix}-ngw-1a
  # ------------------------------------------------------------#
  # EIP
  # ------------------------------------------------------------#
  EIPForNGW1a: 
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
      Tags:
        - Key: Name
          Value: !Sub ${Prefix}-eip-forngw1a
  # ------------------------------------------------------------#
  # VPCEndpoint
  # ------------------------------------------------------------#
  VPCES3:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      RouteTableIds:
        - !Ref PrivateRTB
      ServiceName: !Sub com.amazonaws.${AWS::Region}.s3
      VpcEndpointType: Gateway
      VpcId: !Ref VPC

  VPCEKMS:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PrivateDnsEnabled: true
      ServiceName: !Sub com.amazonaws.${AWS::Region}.kms
      SubnetIds:
      - !Ref PrivateSubnet1a
      - !Ref PrivateSubnet1c
      VpcEndpointType: Interface
      VpcId: !Ref VPC

  VPCELogs:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PrivateDnsEnabled: true
      ServiceName: !Sub com.amazonaws.${AWS::Region}.logs
      SubnetIds:
      - !Ref PrivateSubnet1a
      - !Ref PrivateSubnet1c
      VpcEndpointType: Interface
      VpcId: !Ref VPC
  # ------------------------------------------------------------#
  # Subnet
  # ------------------------------------------------------------#
  PublicSubnet1a:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Ref PublicSubnet1aCidrBlock
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub ${Prefix}-subnet-public-1a

  PrivateSubnet1a:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Ref PrivateSubnet1aCidrBlock
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      Tags:
        - Key: Name
          Value: !Sub ${Prefix}-subnet-private-1a

  PrivateSubnet1c:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Ref PrivateSubnet1cCidrBlock
      VpcId: !Ref VPC
      AvailabilityZone: !Select [ 1, !GetAZs ]
      Tags:
        - Key: Name
          Value: !Sub ${Prefix}-subnet-private-1c

※AZについて「商用環境では可用性を考慮して2以上を指定する事をお勧めします。」と元のハンズオン内で説明がありました。


IAM Identity Centerコンソールでの作業

IAM Identity Centerコンソールにアクセスします。

左サイドカラムから「ユーザー」をクリックし、「ユーザーを追加」ボタンをクリックします。


全ての項目を入力します。
Eメールアドレスは実在するご自身のアドレスをご入力ください。


画像のブロック以外の「任意」と記載のあるブロック(畳まれている部分)はそのままで「次へ」ボタンをクリック。


グループ追加はせずに「次へ」をクリック。


内容を確認して「ユーザーを追加」をクリック。


ユーザー作成が完了しました。


左サイドカラムから「アプリケーション」をクリックし、「アプリケーションを追加」をクリックします。


「カスタム SAML 2.0 アプリケーションの追加」にチェックを入れます。


その他は何も選択せずに。「次」をクリック。


中段の「IAM Identity Center メタデータ」ブロックで「IAM Identity Center SAML メタデータファイル」をダウンロードします。


「送信」ボタンは押さずに一旦この画面を閉じずに放置します。

※次の章の作業は別のタブで行います。


指定したメールアドレスに来たメールを確認

先ほど入力したメールアドレス宛に「Invitation to join IAM Identity Center (successor to AWS Single Sign-On)」というメールが届いています。
以下の「Accept Invitation」ボタンをクリックします。


ブラウザ上に「新規ユーザーのサインアップ」画面が開きます。
任意のパスワードを入力し、「新しいパスワードを設定」をクリック。


「サインイン」画面で「次へ」をクリック


先ほど設定したパスワードを入力し「サインイン」をクリック。


以下画面が確認出来ればこのブロックは一旦完了です。


WorkSpaces Webコンソールでの作業

WorkSpaces Webコンソールにアクセスします。

左サイドカラムから「ウェブポータル」をクリックし、「ウェブポータルを作成」ボタンをクリックします。


VPC:テンプレートで作成されたVPCを選択
サブネット:テンプレートで作成されたプライベートサブネット×2を選択。
セキュリティグループ:デフォルトのセキュリティグループ
を選択して「次へ」をクリック。


ステップ2「ウェブポータルの設定を構成」
ステップ3「ユーザー設定を選択」
は何もせず「次へ」をクリック。


ステップ4「アイデンティティプロバイダーを設定」で
「標準」にチェックのまま
「標準IdPで続行」ボタンをクリック。


上部に「ウェブポータルが正常に作成されました。」という緑帯が確認出来ます。


中段の「サービスプロバイダー (SP) の詳細」ブロックで、「メタデータファイルをダウンロード」ボタンをクリックします。


すぐ下の「シングルログアウト (SLO)」ブロックで、「IdP メタデータドキュメント」ブロックの「ファイルを選択」ボタンをクリックします。


前々章の最後でダウンロードした以下ファイルを選択して「開く」をクリック。
「Custom SAML 2.0 application_ins-xxxxxxxxxxxxxxxx.xml」


「次へ」をクリック。


確認画面で内容を確認し「ウェブポータルを起動」ボタンをクリック。


上部に「ウェブポータルを起動しています。このプロセスが完了するまでに通常10〜15分かかります。」という青帯が確認出来ます。


一旦このブロックは完了です。


再びIAM Identity Centerコンソールでの作業

先ほど放置していた画面に戻ります。
最下部の「アプリケーションメタデータ」ブロックから「アプリケーション SAML メタデータファイル」にチェックを入れ「ファイルの選択」ボタンをクリックします。


「ServiceProviderMetadata_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.xml」ファイルを選択し「開く」をクリック。


「送信」をクリック。


上部に「「Custom SAML 2.0 application」の設定が保存されました。」という緑帯が確認出来ます。

表示画面内で「アクションボタン」をクリックし「属性マッピングを編集」をクリック。


中央欄:「${user:email}」
右ドロップダウンリスト:「emailAddress」
として、「変更の保存」ボタンをクリック。


上部に「SAMLアサーションは正常に更新されました。」と緑帯が確認出来ます。


今度は「ユーザーを割り当て」ボタンをクリック。


作成したユーザーを選択し、「ユーザーを割り当て」ボタンをクリック。

以上で全ての設定が終わりました。


WorkSpaces Webコンソールからエンドポイントへアクセスして表示を確認

WorkSpaces Webコンソールへ戻ります。

「ウェブポータルエンドポイント」が完成していますのでクリックします。


別タブで以下画面が開きます。「サインイン」をクリック。


起動待ち



無事Chromeに接続出来ました。(若干解像度が低めの為リモートアクセスしている感じがわかります。)

以上でした。


おまけ

①日本語入力を可能にする

右上の入力言語が「en」になっている為、日本語入力が出来ません。


日本語を選択します。


入力出来るようになりました。

②上部のメニューを確認

上部にあるバーのメニューアイコン


「Appstream 2.0」のアプリとして動いている事がわかります。

ファイルをアップ出来るようです。

機器接続

2画面分割

Fnキー

終了


③片付けが必要なリソース(実際に作成した方向け)

「WorkSpaces Web」コンソール
ウェブポータル

「IAM Identity Center」コンソール
・アプリケーション
・ユーザー

「CloudFormation」コンソール
・スタック


終わりに

お付き合いいただき、有難うございました。

デベキャン

Discussion