目次
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 アクセス管理ツールとの連携強化
目次
- 概要
- EC2 Instance Connect が解決する課題
- 主な特徴
- アーキテクチャ
- コアコンポーネント
- 主要ユースケース
- 設定・操作の具体例
- 類似サービス比較表
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース・参考文献
- 実装例
- チェックリスト
- まとめ
- 参考文献
概要
初心者向けメモ: 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 ログ:
SendSSHPublicKeyAPI 呼び出し記録 - 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 ログ監視:
SendSSHPublicKeyAPI 呼び出しが全て記録、定期確認 - [ ] 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 による中央アクセス管理
- 監査ログ統一:複数接続方式のログ一元化
学習リソース・参考文献
公式ドキュメント
-
EC2 Instance Connect User Guide
-
EC2 Instance Connect Endpoint Documentation
-
AWS IAM EC2 Instance Connect Actions
ec2-instance-connect:SendSSHPublicKeyec2-instance-connect:OpenTunnel
AWS ブログ・ホワイトペーパー
-
AWS Security Blog - Instance Connect Endpoint
- セキュリティアーキテクチャ解説
-
AWS Architecture Blog - Bastion Host 廃止
- EICE による Bastion 置き換え戦略
OSS / サードパーティ
-
Teleport - SSH Certificate Authority
-
HashiCorp Boundary - Identity-based Access
学習プラットフォーム
-
A Cloud Guru - EC2 Security Deep Dive
- Instance Connect ハンズオン
-
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