目次

EC2 Instance Connect 完全ガイド v2.0

初心者から実務者向けの包括的解説

EC2 Instance Connect(EIC) は、「AWS が一時的な SSH 公開鍵をインスタンスのメタデータに送信することで、キーペアファイル管理なしに IAM 認証により EC2・RDS・内部 API へセキュアに SSH/SCP 接続できる仕組み」 です。EC2 Instance Connect Endpoint(EICE)を使えば、パブリック IP なし・踏み台ホスト不要でプライベートサブネットのリソースに直接接続可能。CloudTrail 監査ログ・IAM ポリシーによる細粒度制御で、セキュリティコンプライアンス要件に対応。本ドキュメントは EIC / EICE の概念・アーキテクチャ・運用・2025-2026 動向を体系的に解説する包括的ガイドです。

ドキュメントの目的

本ガイドは以下を対象としています。

  • 初心者向け: SSH キーペア管理が困難な場合の代替手段を学びたい方
  • セキュリティ担当者向け: IAM ベースのアクセス制御・監査ログを実装したい方
  • 開発者・SRE 向け: プライベートサブネット内部リソースへの踏み台不要アクセスを実現したい方
  • 意思決定者向け: SSM Session Manager との使い分け・セキュリティ戦略検討

2025-2026 年の EC2 Instance Connect エコシステム

  • IPv6 Support(2025年10月):EICE が IPv6 デュアルスタック対応、IPv6 only インスタンスへの接続可能化
  • 全リージョン・GovCloud・China 対応:グローバルおよび規制対象リージョンでの利用可能化
  • CloudTrail 統合深化:すべての SSH 接続試行・成功をシームレスに記録
  • IAM Condition 拡張:ec2:osuser / インスタンス ID 条件による細粒度制御
  • Teleport / HashiCorp Boundary 統合:第三者 SSH アクセス管理ツールとの連携強化

目次

  1. 概要
  2. EC2 Instance Connect が解決する課題
  3. 主な特徴
  4. アーキテクチャ
  5. コアコンポーネント
  6. 主要ユースケース
  7. 設定・操作の具体例
  8. 類似サービス比較表
  9. ベストプラクティス
  10. トラブルシューティング
  11. 2025-2026 最新動向
  12. 学習リソース・参考文献
  13. 実装例
  14. チェックリスト
  15. まとめ
  16. 参考文献

概要

初心者向けメモ: EC2 Instance Connect は「SSH キーペアの代わりに、接続時に一時的な SSH 公開鍵を EC2 インスタンスに送信して認証する仕組み」です。従来は SSH キーペアを紛失・漏洩しないよう管理が必要でしたが、EIC なら接続時のみ公開鍵が有効(60秒)で、接続後は自動削除されるため、キー管理の煩雑さが解消されます。EC2 Instance Connect Endpoint(EICE)を使えば、プライベートサブネット内の EC2 インスタンスも踏み台ホスト不要で直接接続できます。

AWS 公式定義:

“Amazon EC2 Instance Connect provides secure, one-time SSH access to your EC2 instances without needing to manage SSH keys or use SSH agent.”

EC2 Instance Connect の位置づけ

graph TD
    A["クライアント<br/>(開発者 PC / CI/CD)"]
    
    subgraph Connection["接続方式"]
        SSH["従来 SSH<br/>(キーペア永続)"]
        EIC["EC2 Instance Connect<br/>(一時公開鍵・60秒)"]
        EICE["EICE + Tunnel<br/>(プライベート接続)"]
        SSM["Session Manager<br/>(HTTPS・エージェント)"]
        Bastion["Bastion Host<br/>(踏み台)"]
    end
    
    EC2["EC2 インスタンス"]
    
    A -->|キーペア管理| SSH
    A -->|IAM 認証| EIC
    A -->|IAM + VPC EP| EICE
    A -->|IAM + Agent| SSM
    A -->|SSH 遠隔| Bastion
    
    SSH --> EC2
    EIC --> EC2
    EICE --> EC2
    SSM --> EC2
    Bastion --> EC2
    
    style EIC fill:#e6ffe6
    style EICE fill:#e6ffe6
    style SSM fill:#e6f3ff

このサービスを選ぶ理由

なぜ EC2 Instance Connect か?

理由 詳細
キーペア管理廃止 永続的な SSH キーペア紛失・漏洩のリスクを排除、接続時のみ一時公開鍵使用
踏み台ホスト不要(EICE) EC2 Instance Connect Endpoint で VPC ピアリング不要、プライベートサブネットに直接アクセス
IAM ベース細粒度制御 ec2-instance-connect:SendSSHPublicKey ポリシーで誰がどのインスタンスに接続できるかを厳密管理
CloudTrail 監査ログ すべての SSH 接続試行・成功を記録、セキュリティ監査・コンプライアンス対応
無料(EICE は有料) 基本的な EC2 Instance Connect は無料、EICE は月額 $32 程度
ワンステップ接続 aws ec2-instance-connect ssh コマンドで即座に接続、設定最小化

具体的なユースケース

  • インシデント対応時の緊急デバッグアクセス(キー準備不要)
  • 開発者ごとに異なる EC2 インスタンスへのアクセス制限(IAM ポリシー)
  • プライベートサブネット内部 RDS・ElastiCache・内部 API への踏み台経由接続
  • 一時的なメンテナンス作業用の短期 SSH アクセス(接続後自動削除)
  • CI/CD パイプラインからの EC2 インスタンス設定・ログ取得

EC2 Instance Connect が解決する課題

課題 従来の SSH キーペア EC2 Instance Connect 解決方法
キーペア管理負荷 ファイル保護・バックアップ・ローテーション・配布管理が複雑 一時公開鍵、接続後自動削除、管理不要
キー紛失・漏洩リスク キーファイル失と警戒、全インスタンス再設定必要 一時鍵なため漏洩時の被害 60秒で消滅
複数ユーザーのキー管理 各ユーザーにキーを配布、キー統一管理困難 IAM ユーザーごとのアクセス制御のみ
踏み台ホスト運用コスト プライベートサブネットアクセスに Bastion 必須、EC2 コスト + セキュリティ管理 EICE で踏み台不要、VPC Endpoint 経由
監査ログ確保困難 SSH 接続ログが分散、コンプライアンス対応困難 CloudTrail に全接続記録、一元監査
開発者 オフボード時の処理 キーを回収・インスタンス再設定 IAM ユーザー削除のみで自動遮断
緊急アクセス キーペア準備に時間、インシデント対応遅延 即座に IAM 権限付与で接続可能

主な特徴

1. 接続方式:2 つのパターン

EC2 Instance Connect(基本)

  • パブリック IP を持つ EC2 インスタンスへの SSH アクセス
  • AWS CLI aws ec2-instance-connect ssh サブコマンド使用
  • ブラウザベースのターミナルも AWS コンソールで提供

EC2 Instance Connect Endpoint(EICE)

  • VPC Endpoint(PrivateLink)経由でプライベートサブネットの EC2 インスタンスにアクセス
  • パブリック IP・IGW 不要
  • 月額 $32(東京リージョン)

2. 認証フロー

1. クライアント(aws ec2-instance-connect コマンド)
     ↓
2. AWS IAM 認証
   (ec2-instance-connect:SendSSHPublicKey 権限確認)
     ↓
3. EC2 Instance Connect API
   → 一時公開鍵をメタデータサービスに送信
     ↓
4. EC2 インスタンス内
   → ~/.ssh/authorized_keys に一時公開鍵を追加(60秒有効)
     ↓
5. SSH セッション開始
   (秘密鍵 + 一時公開鍵のペア)
     ↓
6. 60秒後
   → 一時公開鍵自動削除

3. サポート OS

正式サポート

  • Amazon Linux 2023 / 2
  • Ubuntu 16.04 以降
  • Debian 9 以降
  • Red Hat Enterprise Linux(RHEL)7 以降
  • CentOS 7 以降
  • Windows Server 2019 / 2022(RDP 接続)

必要条件

  • EC2 Instance Connect エージェント インストール(AL2023 / Ubuntu は標準装備)
  • IAM Role に接続権限設定

4. セキュリティ特性

  • 一時公開鍵:60秒有効、自動削除、使い捨て
  • IAM ベース認可:ポリシー定義で細粒度制御
  • CloudTrail ログSendSSHPublicKey API 呼び出し記録
  • IP 制限:EICE セキュリティグループで送信元 IP 制限可能
  • Session ログ:CloudWatch Logs / Session Manager と統合可能

アーキテクチャ

標準的な EC2 Instance Connect フロー

graph LR
    A["クライアント PC<br/>aws ec2-instance-connect ssh"]
    B["AWS IAM"]
    C["EC2 Instance Connect API"]
    D["EC2 インスタンス<br/>(パブリック IP 有)"]
    E["インターネット"]
    
    A -->|IAM 認証リクエスト| B
    B -->|SendSSHPublicKey 確認| C
    C -->|一時公開鍵・60秒有効| D
    D -->|SSH セッション| A
    A -->|SSH 通信| E
    E -->|ポート 22 / TCP| D
    
    style D fill:#e6ffe6
    style C fill:#99ccff

EC2 Instance Connect Endpoint(EICE)フロー

graph LR
    A["クライアント PC"]
    B["IAM"]
    C["EICE<br/>VPC Endpoint<br/>PrivateLink"]
    D["EC2 インスタンス<br/>プライベートサブネット"]
    
    A -->|IAM 認証| B
    B -->|権限確認| C
    C -->|一時公開鍵| D
    D -->|SSH| A
    C -->|プライベートネット| D
    
    style C fill:#e6f3ff
    style D fill:#e6ffe6

コアコンポーネント

1. EC2 Instance Connect(基本)

用途

  • パブリック IP 付き EC2 インスタンスへの SSH/RDP
  • 開発環境・テスト環境の迅速なアクセス
  • 緊急デバッグ

コスト

  • 無料(AWS アカウント内)

制限

  • パブリック IP 必須
  • ポート 22(SSH)/ 3389(RDP)オープン必須

2. EC2 Instance Connect Endpoint(EICE)

用途

  • プライベートサブネット内部 EC2 インスタンスへのアクセス
  • RDS / ElastiCache・内部 API のポートフォワーディング
  • Bastion ホスト廃止

コスト

  • 月額 $32(東京リージョン)+ データ転送料
  • 日本向けトラフィック $0.05/GB

前提条件

  • VPC Subnet(通常はプライベート推奨)
  • Security Group(送信元 IP 制限)
  • IAM Role

3. IAM ポリシー

基本权限

{
  "Action": "ec2-instance-connect:SendSSHPublicKey",
  "Resource": "arn:aws:ec2:REGION:ACCOUNT:instance/*"
}

細粒度制御例

{
  "Action": "ec2-instance-connect:SendSSHPublicKey",
  "Resource": "arn:aws:ec2:REGION:ACCOUNT:instance/*",
  "Condition": {
    "StringEquals": {
      "ec2:osuser": "ec2-user"
    }
  }
}

主要ユースケース

1. インシデント対応・緊急デバッグ

シナリオ

  • 本番環境で障害発生
  • SSH キーペア不在・紛失した場合
  • 緊急ユーザーの管理者アクセス

実装例

# 1. IAM ユーザーに一時的な権限付与
aws iam put-user-policy \
  --user-name oncall-engineer \
  --policy-name emergency-access \
  --policy-document '{...SendSSHPublicKey...}'

# 2. すぐに接続
aws ec2-instance-connect ssh \
  --instance-id i-0123456789abcdef0 \
  --os-user ec2-user

# 3. 作業完了後、権限削除
aws iam delete-user-policy \
  --user-name oncall-engineer \
  --policy-name emergency-access

2. プライベートサブネット内部リソースアクセス

シナリオ

  • RDS(プライベート)への SQL クライアント接続
  • ElastiCache(Redis)への CLI 接続
  • 内部マイクロサービス API へのデバッグ

実装例

# EICE 経由で RDS にポートフォワーディング
aws ec2-instance-connect open-tunnel \
  --instance-id i-0123456789abcdef0 \
  --local-port 3306 &

# ローカルホスト経由で RDS 接続
mysql -h localhost -P 3306 \
      -u admin \
      -p \
      mydb

3. CI/CD パイプラインでの EC2 設定・デプロイ

シナリオ

  • GitHub Actions / CodeBuild から EC2 に SCP でファイル転送
  • デプロイスクリプト実行
  • ログ取得

実装例(GitHub Actions)

name: Deploy to EC2

on: [push]

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
    steps:
      - uses: actions/checkout@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: arn:aws:iam::ACCOUNT:role/github-actions-role
          aws-region: ap-northeast-1

      - name: Deploy to EC2
        run: |
          # SCP で build artifacts 転送
          aws ec2-instance-connect send-ssh-public-key \
            --instance-id i-0123456789abcdef0 \
            --os-user ec2-user \
            --availability-zone ap-northeast-1a \
            --ssh-public-key file://${{ runner.temp }}/id_rsa.pub

          scp -i ${{ runner.temp }}/id_rsa \
              ./build-output/* \
              ec2-user@EC2_PUBLIC_IP:/opt/app/

          # デプロイスクリプト実行
          ssh -i ${{ runner.temp }}/id_rsa \
              ec2-user@EC2_PUBLIC_IP \
              '/opt/app/deploy.sh'

4. 開発チームの段階的アクセス制御

シナリオ

  • 開発環境 EC2:全チームメンバーアクセス可
  • ステージング環境 EC2:シニア開発者のみアクセス
  • 本番環境 EC2:SRE / インフラチーム + 週番のみ

実装例(IAM ポリシー)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DevEnvironmentAccess",
      "Effect": "Allow",
      "Action": "ec2-instance-connect:SendSSHPublicKey",
      "Resource": "arn:aws:ec2:*:ACCOUNT:instance/i-dev-*"
    },
    {
      "Sid": "StagingEnvironmentAccess",
      "Effect": "Allow",
      "Action": "ec2-instance-connect:SendSSHPublicKey",
      "Resource": "arn:aws:ec2:*:ACCOUNT:instance/i-staging-*",
      "Principal": {
        "AWS": "arn:aws:iam::ACCOUNT:group/senior-developers"
      }
    },
    {
      "Sid": "ProductionEnvironmentAccess",
      "Effect": "Allow",
      "Action": "ec2-instance-connect:SendSSHPublicKey",
      "Resource": "arn:aws:ec2:*:ACCOUNT:instance/i-prod-*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalTag/oncall": "true"
        }
      }
    }
  ]
}

設定・操作の具体例

CLI 例 1:基本的な SSH 接続

# 最もシンプルな接続方法
aws ec2-instance-connect ssh \
  --instance-id i-0123456789abcdef0 \
  --os-user ec2-user

# または IP アドレス指定
aws ec2-instance-connect ssh \
  --instance-id i-0123456789abcdef0 \
  --os-user ec2-user \
  --ip-address 10.0.1.100

CLI 例 2:EICE 経由でプライベート EC2 に接続

# EICE を使用して SSH 接続
aws ec2-instance-connect ssh \
  --instance-connect-endpoint-id eice-0123456789abcdef0 \
  --instance-id i-private-app \
  --os-user ec2-user

CLI 例 3:ポートフォワーディング(RDS 接続)

# EICE 経由でポートフォワーディングを開始
aws ec2-instance-connect open-tunnel \
  --instance-id i-0123456789abcdef0 \
  --remote-port 3306 \
  --local-port 3306 &

# MySQL クライアント接続(localhost:3306 は EICE 経由で RDS:3306 へ)
mysql -h 127.0.0.1 -P 3306 -u admin -p mydb

CLI 例 4:SCP ファイル転送

# 手動で公開鍵を送信してから SCP
aws ec2-instance-connect send-ssh-public-key \
  --instance-id i-0123456789abcdef0 \
  --availability-zone ap-northeast-1a \
  --os-user ec2-user \
  --ssh-public-key file://~/.ssh/id_rsa.pub

# 60秒以内に SCP 実行
scp -i ~/.ssh/id_rsa \
    ./myfile.txt \
    ec2-user@EC2_PUBLIC_IP:/home/ec2-user/

CLI 例 5:EICE 作成

# VPC 内にEICE を作成(プライベートサブネット)
aws ec2 create-instance-connect-endpoint \
  --subnet-id subnet-private-12345678 \
  --security-group-ids sg-0123456789abcdef0 \
  --preserve-client-ip false \
  --tag-specifications 'ResourceType=instance-connect-endpoint,Tags=[{Key=Name,Value=private-access-eice},{Key=Environment,Value=production}]'

# EICE ID を取得
EICE_ID=$(aws ec2 describe-instance-connect-endpoints \
  --filters "Name=tag:Name,Values=private-access-eice" \
  --query 'InstanceConnectEndpoints[0].InstanceConnectEndpointId' \
  --output text)

echo "EICE ID: $EICE_ID"

SDK 例(Python)

import boto3

ec2_ic = boto3.client('ec2-instance-connect', region_name='ap-northeast-1')

# 公開鍵を送信
response = ec2_ic.send_ssh_public_key(
    InstanceId='i-0123456789abcdef0',
    InstanceOSUser='ec2-user',
    SSHPublicKey=open('/home/user/.ssh/id_rsa.pub').read(),
    AvailabilityZone='ap-northeast-1a'
)

print(f"Success: {response['Success']}")
print(f"RequestId: {response['RequestId']}")

# 接続後、SSH セッション確立
# subprocess.run(['ssh', '-i', '~/.ssh/id_rsa', 'ec2-user@EC2_PUBLIC_IP'])

IaC 例(CloudFormation)

AWSTemplateFormatVersion: '2010-09-09'
Description: 'EC2 Instance Connect Endpoint'

Resources:
  EICE:
    Type: AWS::EC2::InstanceConnectEndpoint
    Properties:
      SubnetId: subnet-12345678
      SecurityGroupIds:
        - sg-0123456789abcdef0
      PreserveClientIp: false
      Tags:
        - Key: Name
          Value: private-access-eice

  EICESecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for EICE
      VpcId: vpc-12345678
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
          Description: Allow HTTPS from any IP

  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for EC2 target
      VpcId: vpc-12345678
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          SourceSecurityGroupId: !GetAtt EICESecurityGroup.GroupId
          Description: Allow SSH from EICE

Outputs:
  EICEId:
    Value: !Ref EICE
    Description: EC2 Instance Connect Endpoint ID

IaC 例(Terraform)

# EC2 Instance Connect Endpoint
resource "aws_ec2_instance_connect_endpoint" "private_access" {
  subnet_id           = aws_subnet.private.id
  security_group_ids  = [aws_security_group.eice.id]
  preserve_client_ip  = false

  tags = {
    Name = "private-access-eice"
  }
}

# EICE Security Group
resource "aws_security_group" "eice" {
  name        = "eice-sg"
  description = "Security group for EICE"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

# EC2 Instance(ターゲット)Security Group
resource "aws_security_group" "ec2_target" {
  name        = "ec2-target-sg"
  description = "Security group for EC2 instances accessed via EICE"
  vpc_id      = aws_vpc.main.id

  ingress {
    from_port       = 22
    to_port         = 22
    protocol        = "tcp"
    security_groups = [aws_security_group.eice.id]
  }
}

# 出力
output "eice_id" {
  value       = aws_ec2_instance_connect_endpoint.private_access.id
  description = "EC2 Instance Connect Endpoint ID"
}

類似サービス比較表

観点 EC2 Instance Connect / EICE SSM Session Manager Teleport HashiCorp Boundary Bastion Host(EC2)
プロトコル SSH(ポート 22) HTTPS(ポート 443) SSH + CA gRPC SSH
エージェント 不要(AL2023 / Ubuntu 標準) SSM Agent 必須 Teleport Agent Boundary Agent 不要
キーペア 不要(一時公開鍵) 不要 有効(CA 署名) 有効(Boundary 署名) 必須
CloudTrail ログ API 呼び出し記録 Session ログ(S3 / CWL) 独自ログ 独自ログ SSH ログ
ファイル転送 SCP / SFTP S3 経由 SCP(CA) SCP(CA) SCP / SFTP
プライベート接続 EICE 経由 VPC Endpoint 経由 VPC Endpoint または Public Private access Bastion を経由
セッション記録 CloudTrail のみ CloudWatch Logs / S3 ビルトイン ビルトイン なし
Workspace 統合 非サポート 統合 統合 統合 統合
OSS / 商用 AWS(OSS 部分あり) AWS OSS 有(商用版) OSS(商用版) AWS
コスト 無料(EICE: `32/月) 無料(VPC EP: `7/月) Self-hosted(無料)/ 商用 Self-hosted(無料)/ 商用 EC2 インスタンス料金
推奨用途 SSH/SCP が必須 / 緊急アクセス セッション記録・監査 / Windows RDP SSH CA / 複雑な権限 マルチクラウド / RBAC 規約制約 / 外部サービス

ベストプラクティス

チェックリスト(優先順)

✅ 推奨事項

  • [ ] IAM ポリシーで最小権限設定:特定インスタンス・特定ユーザーのみに許可
  • [ ] CloudTrail ログ監視SendSSHPublicKey API 呼び出しが全て記録、定期確認
  • [ ] EICE 使用時は SG で送信元制限:信頼できる IP / VPC CIDR のみ許可
  • [ ] プライベートサブネット EC2 は EICE経由へ:Bastion ホスト廃止でセキュリティ・コスト改善
  • [ ] Session Manager と併用検討:ファイル転送が少ない場合は Session Manager(HTTPS)を選択
  • [ ] 定期アクセス監査:月 1 回 CloudTrail ログ確認、不正アクセス検知
  • [ ] 緊急アクセス用の IAM Role 事前準備:インシデント時の迅速アクセスを実現
  • [ ] EC2 インスタンス SG で 22/TCP EICE SG からのみ許可 → インターネットからの直接 SSH 遮断
  • [ ] RDS / ElastiCache・内部 API へのポートフォワーディング活用:踏み台不要化
  • [ ] IPv6 デュアルスタック対応(2025+):IPv6 インスタンスへのアクセスを検証

❌ アンチパターン

アンチパターン 問題 代替
全ユーザーに SendSSHPublicKey 権限付与 キーペアと同じリスク、アクセス制御なし IAM ポリシーで インスタンス / ユーザー制限
EC2 インスタンス SG で 22/TCP を 0.0.0.0/0 に開放 不正アクセス、ブルートフォース攻撃 EICE SG からのみ許可
EICE を public SG に配置 VPC Endpoint 意義なし プライベートサブネットに配置
CloudTrail ログ無視 監査ログなし、セキュリティ事件時に証跡なし CloudTrail 有効化・S3 保存
Session Manager を検討せず EIC で全て実装 ファイル転送・Windows RDP に不便 用途に応じて Session Manager と使い分け
キーペア管理を廃止 EIC は 60 秒一時鍵だが、バックアップ手段なし 緊急用キーペア 1 個は保持

トラブルシューティング

症状 原因 解決策
「Unauthorized operation」エラー IAM ポリシーの SendSSHPublicKey 権限不足 IAM ポリシーに ec2-instance-connect:SendSSHPublicKey を追加
「Public IP not available」エラー EC2 インスタンスがパブリック IP を持たない EICE 使用または IP 割り当て確認
EICE 経由接続タイムアウト EICE SG / EC2 SG ルール不正 SG インバウンド 443(EICE) / 22(EC2) 確認
SCP / SFTP で「Permission denied」 SSH キーペア権限 / ファイルパーミス ssh-keygen で新鍵生成、chmod 600 確認
Session 接続後すぐに切断 EC2 インスタンス agent 停止 / ユーザー非存在 aws ec2-instance-connect ec2-user / ubuntu / admin 確認
CloudTrail ログに記録されない CloudTrail 無効 / 14日保持期限超過 CloudTrail 有効化、S3 に 1年保存設定
60秒以内に SSH 接続できない 公開鍵送信後、遅延で期限切れ aws ec2-instance-connect send-ssh-public-key 直後に ssh 実行
プライベート RDS / ElastiCache ポート接続失敗 ターゲット SG ルール不正 / ネットワークルート RDS / Redis SG でインスタンス SG(送信元)許可確認
EICE 削除後もコスト課金 削除確認不完全 / 関連 ENI 残存 aws ec2 delete-instance-connect-endpoint 実行確認、ENI 確認

2025-2026 最新動向

IPv6 Support(2025年10月)

新機能

  • EICE が IPv6 デュアルスタック対応
  • IPv6 only インスタンスへのアクセス可能化
  • 既存 IPv4 との後方互換性維持

利点

  • 次世代インターネット対応
  • IPv6 only VPC(カスタマイズネットワーク)をサポート
  • グローバル IP アドレス枯渇対応

全リージョン・GovCloud・China 対応

  • AWS Commercial Regions:全 33 リージョン
  • AWS GovCloud (US):US East / US West
  • China Regions:北京・寧夏

CloudTrail 統合深化

  • 詳細ログ:接続試行・成功・失敗・コマンド実行履歴
  • CloudWatch Logs への直接配置
  • S3 + Athena による分析

IAM Condition 拡張

  • ec2:osuser 条件:特定 OS ユーザーのみ許可
  • インスタンスタグ条件:Environment=production のみ許可
  • 時間ベース条件:営業時間のみ接続可能

Teleport / HashiCorp Boundary 統合強化

  • Teleport SSH CA 統合:EICE + Teleport の複合利用
  • Boundary Proxy 経由:Boundary による中央アクセス管理
  • 監査ログ統一:複数接続方式のログ一元化

学習リソース・参考文献

公式ドキュメント

  1. EC2 Instance Connect User Guide

  2. EC2 Instance Connect Endpoint Documentation

  3. AWS IAM EC2 Instance Connect Actions

    • ec2-instance-connect:SendSSHPublicKey
    • ec2-instance-connect:OpenTunnel

AWS ブログ・ホワイトペーパー

  1. AWS Security Blog - Instance Connect Endpoint

    • セキュリティアーキテクチャ解説
  2. AWS Architecture Blog - Bastion Host 廃止

    • EICE による Bastion 置き換え戦略

OSS / サードパーティ

  1. Teleport - SSH Certificate Authority

  2. HashiCorp Boundary - Identity-based Access

学習プラットフォーム

  1. A Cloud Guru - EC2 Security Deep Dive

    • Instance Connect ハンズオン
  2. Pluralsight - AWS Security Best Practices

    • EICE / Session Manager 比較コース

実装例

例 1:緊急アクセス用 IAM Role

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowEC2InstanceConnect",
      "Effect": "Allow",
      "Action": [
        "ec2-instance-connect:SendSSHPublicKey",
        "ec2:DescribeInstances"
      ],
      "Resource": "*"
    },
    {
      "Sid": "AllowEICEAccess",
      "Effect": "Allow",
      "Action": [
        "ec2-instance-connect:OpenTunnel",
        "ec2:DescribeInstanceConnectEndpoints"
      ],
      "Resource": "*"
    }
  ]
}

例 2:GitHub Actions CI/CD パイプライン

name: Deploy with SSH

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - uses: actions/checkout@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/github-ci-deploy
          aws-region: ap-northeast-1

      - name: Build application
        run: |
          npm ci
          npm run build

      - name: Deploy to EC2 via EIC
        run: |
          # 公開鍵を送信
          aws ec2-instance-connect send-ssh-public-key \
            --instance-id ${{ secrets.EC2_INSTANCE_ID }} \
            --os-user ec2-user \
            --availability-zone ap-northeast-1a \
            --ssh-public-key file://$HOME/.ssh/id_rsa.pub

          # ファイル転送
          scp -o StrictHostKeyChecking=no \
              -i $HOME/.ssh/id_rsa \
              -r ./dist/* \
              ec2-user@${{ secrets.EC2_PUBLIC_IP }}:/var/www/

          # デプロイスクリプト実行
          ssh -o StrictHostKeyChecking=no \
              -i $HOME/.ssh/id_rsa \
              ec2-user@${{ secrets.EC2_PUBLIC_IP }} \
              'cd /var/www && ./deploy.sh'

例 3:プライベート RDS へのポートフォワーディング

#!/bin/bash

# EICE 経由で RDS へのポートフォワーディング確立
EICE_ID="eice-0123456789abcdef0"
RDS_HOST="mydb.c9akciq32.ap-northeast-1.rds.amazonaws.com"
RDS_PORT="3306"
LOCAL_PORT="3306"

# トンネル開始
aws ec2-instance-connect open-tunnel \
  --instance-id $EICE_ID \
  --remote-address $RDS_HOST \
  --remote-port $RDS_PORT \
  --local-port $LOCAL_PORT &

TUNNEL_PID=$!
sleep 2

# MySQL クライアント接続
mysql -h 127.0.0.1 \
      -P $LOCAL_PORT \
      -u admin \
      -p

# クリーンアップ
kill $TUNNEL_PID

チェックリスト

導入前

  • [ ] IAM ユーザー / Role に ec2-instance-connect:SendSSHPublicKey 権限付与
  • [ ] EC2 インスタンス SG でポート 22/TCP を確認(EICE 使用時は EICE SG のみ)
  • [ ] EC2 インスタンスの SSH キーペア削除(不要な場合)
  • [ ] CloudTrail 有効化確認

デプロイ後

  • [ ] AWS CLI で aws ec2-instance-connect ssh 接続テスト
  • [ ] CloudTrail ログに接続記録確認
  • [ ] SCP / SFTP ファイル転送テスト
  • [ ] EICE 使用時、VPC Endpoint 作成・SG 設定確認
  • [ ] ポートフォワーディング(RDS / ElastiCache)テスト

運用時

  • [ ] 月 1 回:CloudTrail ログ監査
  • [ ] 四半期ごと:IAM ポリシー見直し
  • [ ] オフボード時:IAM ユーザー削除で自動遮断確認
  • [ ] セキュリティアップデート:60秒一時鍵仕様の検証

まとめ

EC2 Instance Connect / EICE は 「SSH キーペア管理を廃止し、IAM 認証 + 一時公開鍵で EC2・プライベートリソースにセキュアにアクセスできる仕組み」 です。特に EICE は Bastion ホスト廃止・VPC Endpoint PrivateLink経由でプライベートアクセスを実現 し、セキュリティ・コスト両面で利点があります。

EC2 Instance Connect / EICE が向いている場合

  • SSH / SCP が必須(ファイル転送)
  • キーペア管理の煩雑さを解消したい
  • IAM ベースのきめ細かいアクセス制御が必要
  • Bastion ホスト廃止でインフラ簡素化
  • インシデント対応時の緊急アクセス

Session Manager を検討すべき場合

  • Windows RDP / PowerShell が必要
  • セッション記録・監査ログが必須
  • ファイル転送は S3 経由で構わない
  • ポート 22 を一切開けたくない(HTTPS のみ)

2025年の IPv6 対応・CloudTrail 統合深化により、セキュリティ監査・グローバルネットワーク対応がさらに強化されました。


最終更新:2026-04-26 バージョン:v2.0