インターネット接続を禁止しているLinux EC2へSSMエージェントを自動的にインストールする方法

<!--原稿ここから-->
<!-- # 目次

1. [はじめに](#anchor1)
2. [やりたいこと](#anchor2)
3. [前提条件](#anchor3)
4. [試したこと](#anchor4)
5. [ハマりポイント](#anchor5)
6. [なぜダウンロードに失敗するのか](#anchor6)
7. [解決方法](#anchor7)
8. [まとめ](#anchor8) -->

<a id="anchor1"></a>
# はじめに
[AWS Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html)を利用するには、EC2インスタンスへSSMエージェントを導入する必要があります。

Amazon Linux 2では初めからAMIにSSMエージェントが導入されていますが、<br>Red Hat Enterprise Linux等の他のLinux AMIを使用する場合は、<br>自前でSSMエージェントのインストール作業が必要になります。<br>
Linux EC2インスタンスへSSMエージェント自動的にインストールし、<br>インスタンス起動後すぐにセッションマネージャーを使用可能にするコードを書いていた時に、<br>軽くハマった内容と解決方法をご紹介します。

<a id="anchor2"></a>
# やりたいこと
インターネット接続を禁止しているサブネットで起動するLinux EC2インスタンスへ<br>AWS所有のS3バケットからSSMエージェントを自動的にインストールしたい。

![vpc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611601/f4308add-4ef3-eb02-a031-c4e26a66348e.png)


<a id="anchor3"></a>
# 前提条件
- 東京リージョンを使用
- EC2インスタンスのAMIはRed Hat Enterprise Linuxを使用
- EC2からS3、SSMエンドポイントへの通信はInternet Gatewayではなく、[VPC Endpoint](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/)を使用
- EC2には[AWS 所有のS3バケットへのアクセス許可](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent-minimum-s3-permissions.html) を含むインスタンスプロファイルをアタッチ
- EC2には[AWS 管理ポリシー AmazonSSMManagedInstanceCore ](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/setup-instance-profile.html) を含むインスタンスプロファイルをアタッチ

<a id="anchor4"></a>
# 試したこと
<!-- [AWS Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html)を利用するには、EC2インスタンスへSSMエージェントを導入する必要があります。

Amazon Linux 2では初めからAMIにSSMエージェントが導入されていますが、<br>Red Hat Enterprise Linux等の他のAMIを使用する場合は、<br>自前でSSMエージェントのインストール作業が必要になります。   -->

AWSのドキュメントやナレッジセンターにて、<br>「[Red Hat Enterprise LinuxインスタンスにSSMエージェントを手動でインストールする方法](https://docs.aws.amazon.com/systems-manager/latest/userguide/agent-install-rhel.html)」や<br>「[Linuxインスタンス起動時にSSMエージェントを自動インストールする方法](https://aws.amazon.com/jp/premiumsupport/knowledge-center/install-ssm-agent-ec2-linux/)」が紹介されています。

まずはEC2起動時にSSMエージェントをAWS所有のS3バケットからダウンロード・インストールするように<br>ユーザーデータで[こちらの記事](https://aws.amazon.com/jp/premiumsupport/knowledge-center/install-ssm-agent-ec2-linux/)のコマンドを実行させてみました。

```
#!/bin/bash
cd /tmp
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
```

<a id="anchor5"></a>
# ハマりポイント
さきほどのコマンドをそのまま実行すると<br>インターネットへ接続できるEC2ではインストールに成功します。


![igw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611601/c4b038f4-90ee-a24a-9b47-abaa1dd117e8.png)


しかし、インターネット接続を禁止しているEC2では<br>AWS所有のS3バケットからのRPMパッケージダウンロードに失敗してしまいました。

![vpce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611601/458552db-fc5b-c6df-1981-551cd35e21b4.png)

<!-- ```
https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
``` -->

ちなみに、サブネットからS3 VPC Endpointへの疎通は[こちらの方法](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-could-not-connect-endpoint-url/)で確認できます。

<a id="anchor6"></a>
# なぜダウンロードに失敗するのか
結論から言うと、S3 VPC Endpointを設置しているにもかかわらず、<br>S3へのアクセス時にS3 VPC Endpointを経由しておらずエラーになっていました。

原因はアクセスするS3のURLに、リージョンを含んでいなかったことです。<br>S3 VPC Endpointを使用するときには、アクセスするリージョンを明示する必要があります。

まず、リージョンを指定しないURL https://s3.amazonaws.com/ でS3にアクセスすると、<br>どのリージョンへ行くのか確認してみます。

```
$ nslookup s3.amazonaws.com
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
s3.amazonaws.com        canonical name = s3-1.amazonaws.com.
Name:   s3-1.amazonaws.com
Address: 52.216.89.102
```

アクセスする[IPアドレス(52.216.89.102)を確認](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-find-ip-address-ranges/)してみると、<br>us-east-1なので米国東部 (バージニア北部)リージョンであることが確認できます。

[![](us-east-1.png)![us-east-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611601/d6b3cfb0-fbc0-c955-9c68-b13a83896a59.png)
](https://ip-ranges.amazonaws.com/ip-ranges.json)

[SSMエージェントは特定のリージョンからダウンロードすることも可能](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html#sysman-install-ssm-agent-specific)ですので、<br>東京リージョンからダウンロードするURL https\://s3.`ap-northeast-1`.amazonaws.com/ に打ち換えて確認してみます。

```
$ nslookup s3.ap-northeast-1.amazonaws.com
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   s3.ap-northeast-1.amazonaws.com
Address: 52.219.4.96
```

アクセスする[IPアドレス(52.219.4.96)を確認](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-find-ip-address-ranges/)してみると、<br>ap-northeast-1なので東京リージョンであることが確認できます。

[![](ap-northeast-1.png)![ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611601/307707af-0727-4ab8-0738-5efcc62cb0bf.png)
](https://ip-ranges.amazonaws.com/ip-ranges.json)

次に、VPCのルートテーブルを確認してみます。<br>S3 VPC Endpoint作成時に関連付けたルートテーブルには、<br>自動的にS3 VPC Endpointへのルーティング設定が追加されます。<br>
このルーティング設定を確認すると、<br>東京リージョンのS3 IPアドレス(52.219.0.0/20,52.219.136.0/22,52.219.16.0/22,52.219.68.0/22)<br>へのアクセスのみS3 VPC Endpointへ送信することが確認できます。<br>先ほど確認したIPアドレス(52.219.4.96)もこのレンジに含まれます。

![routetable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611601/f7ab3d9e-e9dc-11af-527b-2fb9ef061719.png)


<a id="anchor7"></a>
# 解決方法
SSMエージェントのダウンロードURLで[リージョン指定](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html#sysman-install-ssm-agent-specific)することにより、<br>S3 VPC Endpointへルーティングされるようになります。<br>これでインターネット接続を禁止しているサブネットからも<br>S3 VPC Endpoint経由でSSMエージェントのダウンロードが行えます。

S3バケットのURLでリージョンを明示的に指定<br>https\://s3.`ap-northeast-1`.amazonaws.com/amazon-ssm-`ap-northeast-1`/latest/linux_amd64/amazon-ssm-agent.rpm


ユーザーデータ全体

```
#!/bin/bash
cd /tmp
sudo curl -O https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/linux_amd64/amazon-ssm-agent.rpm
sudo yum -y localinstall amazon-ssm-agent.rpm
sudo systemctl enable amazon-ssm-agent
sudo systemctl start amazon-ssm-agent
```
<a id="anchor8"></a>
# まとめ
EC2インスタンスを起動した直後からセッションマネージャーが使えるととても便利ですよね。<br>
S3 VPC Endpoinの振る舞いをおさらいしつつ、<br>AWS Session Managerをインターネット接続を禁止しているEC2に自動的にインストールする方法と、<br>SSMエージェントのインストールパッケージをVPCエンドポイント経由でダウンロードする方法を紹介しました。

以上です。