GUI を使用して Amazon EC2 Mac インスタンスにアクセスしてみた



# <font color="rgb(107, 142, 35)">目次</font>

* [はじめに](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
* [要約](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#%E8%A6%81%E7%B4%84)
* [構成](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#%E6%A7%8B%E6%88%90)
* [Dedicated Hostsの割り当て](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#dedicated-hosts%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6)
* [Macインスタンスの作成](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#mac%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90)
* [Macインスタンスの設定](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#mac%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A)
* [Windowsインスタンスの設定](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#windows%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A)
* [VNC接続を実行](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#vnc%E6%8E%A5%E7%B6%9A%E3%82%92%E5%AE%9F%E8%A1%8C)
* [終わりに](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB)
* [参考記事](https://qiita.com/koji-koji-koji/private/8ae398aec15a3d5d8382#%E5%8F%82%E8%80%83%E8%A8%98%E4%BA%8B)

# <font color="rgb(107, 142, 35)">はじめに</font>
Mac環境で開発を行う必要があり、AWS上でMacインスタンスを立てて作業できる環境を整えてみました。LinuxやWindowsインスタンスへSSHやRDPで接続したことがある方は多いと思いますが、Macインスタンスへの接続をしたことがある方はそんなに多くないのではと思い、記事としてまとめてみました。

:::note warn
開発する期間にもよりますが、占有ホストを割り当てることによる課金が意外とかかるので、
ぶっちゃけ物理PCを買ってしまった方が安く済むかもしれません。それを念頭に置いたうえで、記事を参照していただけると良いと思います。
:::

# <font color="rgb(107, 142, 35)">要約</font>

* Macインスタンスを構築するために占有ホストの割り当てを実施しました。
* WindowsインスタンスにRDP接続し、そこからMacインスタンスにVNC接続しました。


# <font color="rgb(107, 142, 35)">構成</font>
下記のような構成で実施しました。（※MacインスタンスにGUI接続することだけを目的とした構成です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/139a6599-59c2-b02e-7a1d-7e279d7489ea.png)



* 各インスタンスにアタッチするセキュリティグループは下記を意識しました。
    * Windowsインスタンス
        * Fleet Managerを利用してRDP接続できる
    * Macインスタンス
        * Windowsインスタンスからポート5900、22で接続できる

* 各インスタンスにアタッチするIAMロールの権限として大雑把に下記が必要でした。
    * Windows
        * セッションマネージャーで接続する権限
        * Fleet Managerで接続する権限
        * S3バケット読み取り権限
    * Macインスタンス
        * セッションマネージャーで接続する権限


# <font color="rgb(107, 142, 35)">Dedicated Hostsの割り当て</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/e4f65c29-66db-f9f8-f8f7-6cd0692174f6.png)

Macインスタンスを立てるのにDedicated Hosts（占有ホスト）の割り当てが必要でした。

:::note info
占有ホストとは
専用の物理サーバーをプロビジョニングして、そこでEC2インスタンスを起動できるサービスです。下記のようなユースケースがあります。

* ライセンスコストの削減
* 企業コンプライアンス要件を満たすように役立つ
* スケジューリング制御によるホスト自動メンテナンス


下記記事を参考にしました。

https://aws.amazon.com/jp/ec2/dedicated-hosts/
https://dev.classmethod.jp/articles/using-ec2-dedicated-hosts/

:::



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/ef2695fe-ca97-a5d5-e640-69beb6c09352.png)

キャプチャーの通り、東京リージョンで、下記のインスタンスファミリー、インスタンスタイプを選択しました。
* インスタンスファミリー：`mac1`
* インスタンスタイプ：`mac1.metal`
    * 料金：$1.083/h(2024年7月時点）

https://aws.amazon.com/jp/ec2/dedicated-hosts/pricing/

:::note warn
占有ホスト割り当て時の注意として、下記があります。認識したうえで利用した方が良いです。
    * 占有ホスト割り当て後、インスタンスの起動有無に関わらずDedicated Hostsを解放するまで課金が発生します。
    * 割り当てた占有ホストをリリースすれば課金は止まりますが、最低24時間の請求期間があります。（24時間はリリースができません）
    * Dedicated Hostsでは最初に設定したインスタンスタイプのみが起動可能です。

下記記事を参考にしました

https://aws.amazon.com/jp/ec2/dedicated-hosts/pricing/
https://dev.classmethod.jp/articles/using-ec2-dedicated-hosts/

:::



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/774c608e-e12a-a363-b1e6-000195d2904d.png)




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/fb8f4f58-144d-6863-2492-4eee67c79eee.png)

# <font color="rgb(107, 142, 35)">Macインスタンスの作成</font>

占有ホストの割り当てができたので、続いてMacインスタンスを作成しました。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/39c6c65c-ca5b-fa57-e40d-f26f4223478f.png)

EC2作成画面で、インスタンスタイプは占有ホスト割り当ての際に選択した`mac1.metal`を選択しました。後々必要になるためキーペアも作成しておきました。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/75d50d71-016c-864d-0dad-b9b0de8442b3.png)

セキュリティグループの設定で、インバウンドルールについて、WindowsインスタンスにアタッチするセキュリティグループIDをソースに指定して、ポート5900（VNC接続用)、22（SSH接続用）を指定しました。

:::note info
VNC（Virtuel Network Computing）接続とは
* ネットワークを通じて別のコンピュータに接続し、そのデスクトップ画面を呼び出して操作することができるリモートデスクトップ技術の一つです。
* 画面を飛ばしたい環境（上記の例ではWindows）でサーバ（vncserver）を動かし、画面を受けとりたい環境（同Linux）でクライアント（vncviewer）を動かします。VNCのサーバとクライアントはRFB（Remote Frame Buffer）という通信プロトコルを使ってデータをやりとりします。
* RDPは主にWindowsで最適化されている一方で、VNCはクロスプラットフォームに対応している。


下記記事を参考にしました。
https://e-words.jp/w/VNC.html
https://engrholiday.jp/win/win-app-vnc-viewer/#google_vignette
https://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0060


:::




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/8c89dffe-1186-dbee-9405-654151222e54.png)

`テナンシー`、`ターゲットホスト`、`テナンシーのホストID`で割り当てた占有ホストに関する情報を指定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/4724197b-b2f6-cdd4-99b3-fd136643ebb6.png)

Macインスタンスが起動できました。（Windowsインスタンスの構築は省略します。以降はWindowsインスタンス構築済み前提で進めていきます。）




# <font color="rgb(107, 142, 35)">Macインスタンスの設定</font>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/ece54305-f551-40f3-a504-e5369da1f8f0.png)

MacインスタンスにセッションマネージャーでSSH接続し、キャプチャーの通り、下記コマンドを実行しました。（Mac OSのスクリーン共有をインストール、起動する）

```
sudo defaults write /var/db/launchd.db/com.apple.launchd/overrides.plist com.apple.screensharing -dict Disabled -bool false
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
```

:::note warn
上記コマンドではVNC接続する際にエラーになりました。（参考にするドキュメントによって記載されているコマンドが異なるようです。後半に発生したエラーと解決方法について記載しています。）
試せてはいませんが、下記を参考にしても良いかもしれません。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-to-mac-instance.html
:::



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/5911d3e3-6ab8-7ae4-5a39-43d823befecf.png)

続いてec2-userのパスワードを設定しました。（Macインスタンスログイン時に使うパスワード）
```
sudo /usr/bin/dscl . -passwd /Users/ec2-user
```



# <font color="rgb(107, 142, 35)">Windowsインスタンスの設定</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/303cdaf1-46bf-6549-67e8-22a754c87b54.png)

まず、AWS CLIのセットアップを実施しました。下記を参考に進めました。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

:::note warn
セットアップウィザード終了後、`aws --version`でインストールできたことを確認しようとしたところ、下記エラーが出ました。

```
'aws' is not recognaized as an internal or external command, operable program or batch file.
```

下記記事の **「考えられる原因: インストール中にオペレーティングシステムの PATH が更新されなかった。」** を参考に環境変数を設定することで無事コマンドが利用できるようになりました。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-troubleshooting.html#tshoot-install-not-found

:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/07c9ecc7-0e67-583d-a2ea-4af2830c4a65.png)


続いて下記コマンドを実行し、WindowsインスタンスからMacインスタンスに対してVNCポートへのSSHトンネルを作成しました。（.sshを作成し、そこにMacインスタンス用秘密鍵ファイルを格納した上で実施しました。）

```
ssh -i <秘密鍵ファイル名> -L 5900:localhost:5900 ec2-user@<MacインスタンスPrivate IP>
```

:::note warn
秘密鍵を利用して接続する際に、Permissionエラーが発生しました。
下記記事を参考に秘密鍵について権限変更を行ってから、再度接続を実施しました。

https://qiita.com/eltociear/items/02e8b1f5590b49eb9d87

:::

# <font color="rgb(107, 142, 35)">VNC接続を実行</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/177c449f-be1d-4a4e-6d91-3fc3a453bb48.png)


以上で準備は終了で、WindowsインスタンスにVNCクライアントソフトウェアをインストールし、Macインスタンスに接続しました。（server:port として <MacインスタンスのPrivate IP>:5900を指定）

:::note alert

今回はVNCクライアントソフトとして **Ultra VNC** を利用しました。何も考えずに同じものを使うのではなく、各VNCクライアントソフトの特徴（セキュリティ面など）やライセンスを十分理解した上で、適切なものを利用した方が良いです。

例えば下記記事で様々なVNCクライアントソフトが紹介されています。
https://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0060

:::

:::note info

Ultra VNCのセットアップは下記を参考に実施しました。

https://logical-studio.com/develop/others/20170120-remoteconnectionfromwindowstomac/

:::

:::note warn
接続時、下記のようなエラーが発生しました。

```shell:VNC接続時エラー
no supported authentication methods
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/2dd97b44-5280-bbc1-58b9-89f1ecbdbc3d.png)

下記を参考に、Macインスタンスで再度コマンドを実行しました。

```
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -access -on -clientopts -setvnclegacy -vnclegacy yes -clientopts -setvncpw -vncpw <Password文字列> -restart -agent -privs -all
```

https://writerman.hatenablog.jp/entry/2020/12/02/134905

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219490/c90a5fa5-950a-2f43-5c86-a51967bc3d1e.png)


VNC接続が成功し、ec2-userに対して設定したパスワードを入力するとMacインスタンスにGUI接続することができました。


# <font color="rgb(107, 142, 35)">終わりに</font>

MacインスタンスへGUI接続するのが、こんなに大変だとは思っていませんでした。今後AWS上でMacを利用して開発される方の参考になれば幸いです。

:::note warn

冒頭にも書きましたが、占有ホストを割り当てることによる課金が意外とかかるので、
ぶっちゃけ物理MacPCを買ってしまった方が安く済むかもしれません。
:::


# <font color="rgb(107, 142, 35)">参考記事</font>


* Macインスタンスへの接続方法

https://repost.aws/ja/knowledge-center/ec2-mac-instance-gui-access

* AWS CLIのセットアップ

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-troubleshooting.html


* SSH接続する際にパーミッションエラーが発生した場合の権限変更

https://qiita.com/eltociear/items/02e8b1f5590b49eb9d87

* UltraVNCのセットアップ

https://logical-studio.com/develop/others/20170120-remoteconnectionfromwindowstomac/