AWS Systems Manager Session Managerが繋がらないときのチェックリスト【プライベートサブネット・NATなし】

# はじめに

Session Managerを使用した接続で詰まったので、自分用に作成しました。

接続先インスタンスのNW状態やSession Managerの設定は以下を想定しています。

- インスタンスはプライベートサブネットに配置
- NATなし
- S3,CloudWatch Losgにロギング
    - インスタンスが上記NW状態の場合、ロギングで使用するサービスのVPCエンドポイントも必要になるので注意
- ログはKMSで暗号化
    - S3はAWSマネージドCMK、CloudWatch LogsはカスタマーマネージドCMK

私の場合、上記3つ目のロギング設定で、CloudWatch LogsのVPCエンドポイントを作成していなかったので接続できませんでした。

コンソール画面でSession ManagerのStart Sessionを始めると、プロンプトが表示されない黒い画面のままずっと変化がない上、エラー文が出ないので困ってしまいました。

本記事の情報は`2021.6.8現在`の情報ですので、参考にする際はお気をつけください。

# チェックリスト

|チェック項目|確認事項|根拠|
|---|--|--|
|エージェント|接続先インスタンスにSSMエージェントがインストールされているか。バージョンは必要とする機能をサポートしているか|https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent-technical-details.html#ami-preinstalled-agent|
|インスタンスのIAMロール|Session Managerを使用するために必要な権限を有しているか|https://docs.aws.amazon.com/systems-manager/latest/userguide/getting-started-create-iam-instance-profile.html|
|インスタンスのセキュリティグループ|アウトバウンドは443を許可しているか（宛先：VPCエンドポイントが使用するNWインターフェースのプライベートIPアドレス。もちろんデフォルトの全て許可でも通る）|https://aws.amazon.com/jp/premiumsupport/knowledge-center/systems-manager-ec2-instance-not-appear/|
|VPCエンドポイント|必要なVPCエンドポイントを作成しているか。Session Managerでロギングする場合、S3やCloudWatch LogsのVPCエンドポイントも必要。AWS KMSのエンドポイントは必要に応じて(暗号化を有効化する場合に必要)|https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/|
|VPCエンドポイントの場所|適切なVPC、サブネットに作成しているか|同上|
|VPCエンドポイントのセキュリティグループ|インバウンドの443を許可しているか（ソース：インスタンスが存在するVPCのCIDR)|同上|
|VPCのDNS|VPCのDNSホストネームとDNSサポートが有効になっているか|同上|
|CloudWatch LogsのCMKキーポリシー(CloudWatch LogsでKMSを使用している場合)|キーポリシーでCloudWatch Logsをプリンシパルとして暗号・復号等のアクションを許可しているか。していない場合、Session Managerは接続できるがCloudWatch Logsのログが見れない（ログストリームはあるものの、中身が空の状態だった）。|検証した結果|



```json:キーポリシー抜粋
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "logs.ap-northeast-1.amazonaws.com"
            },
            "Action": [
                "kms:Encrypt*",
                "kms:Decrypt*",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:Describe*"
            ],
            "Resource": "*",
            "Condition": {
                "ArnLike": {
                    "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:ap-northeast-1:{Account-Id}:log-group:{CloudWatchLogs-LogGroupName}"
                }
            }
        }
```

```json:インスタンスのIAMロール
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel",
                "ssm:UpdateInstanceInformation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::{Bucket-Name}/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetEncryptionConfiguration"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:ap-northeast-1:{Account-Id}:key/xxxxxx-635f-4454-8f2f-xxxxxxxxxxx"
        }
    ]
}

```

上記`kms:Decrypt`はセッションデータの暗号化をしなければ不要。
セッションデータの暗号化をする際のアクセス許可は以下のとおりにすればよい。

https://docs.aws.amazon.com/systems-manager/latest/userguide/session-preferences-enable-encryption.html


# 参考情報

- sshやポートフォワーディングを介してのセッションはロギングできなくなる
    - https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html

- セッションデータを暗号化して接続すると以下のメッセージが表示される
    - This session is encrypted using AWS KMS.

- Session Managerのログを配信するS３は他のアカウントのS3でもよい。
    - チェックリストの"インスタンスのIAMロール"の根拠欄記載のURLに"別のAWSアカウントが所有するAmazon S3バケットにセッションログを出力するには"といった旨の記載がある。

- インスタンスのIAMロールの反映は、SSMエージェントが検出するまで待機するか、SSMエージェントを再起動する必要がある
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/assign-iam-role-ec2-instance/

- Session Manager を使用して Amazon EC2 インスタンスに接続できないのはなぜですか?
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/ssm-session-manager-connect-fail/
- AWS Systems Manager Session Manager の問題をトラブルシューティングする方法を教えてください。
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/ssm-session-manager-failures/
- EC2 Linux インスタンスで Session Manager シェルを bash に変更するにはどうすればよいですか?
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/ssm-session-manager-change-shell/
- Session Manager を使用してインスタンスへのアクセスを制御するにはどうすればよいですか?
    - https://aws.amazon.com/jp/premiumsupport/knowledge-center/ssm-session-manager-control-access/