AWS CloudShellの、特にネットワークとIAM権限周りを調査しました。
⚡TL;DR
- AWS CloudShell は AWS マネジメントコンソールから即使える事前認証済みシェル
- インバウンド通信不可 / アウトバウンド専用 の安全設計
- VPC 統合 CloudShell では指定 VPC / サブネットに ENI が作成される
- パブリックサブネットでも NAT がないとインターネットに出られない
- IAM では
cloudshell:*に加え EC2 ネットワーク権限が必須 - 条件キーにより VPC を強制指定した CloudShell 設計 が可能
🔰はじめに
AWS CloudShell は、AWS マネジメントコンソールから直接起動できる
ブラウザベースの Linux シェル環境 です。
CLI 用の EC2 を立てることなく、
AWS CLI や SDK を 即・安全に実行 できる点が評価されています。
本記事では、以下の公式情報をベースに、
- ネットワーク設計
- IAM 権限モデル
- VPC 統合時の落とし穴
を 設計者視点 で解説します。
📝AWS CloudShell とは
AWS CloudShell は以下の特徴を持ちます。
- Amazon Linux 2023 ベース
- AWS CLI / git / Python / Node.js 等がプリインストール
- コンソールログイン中の IAM 認証情報が自動注入
- リージョンごとに 1GB の永続ストレージ(※VPC 環境除く)
公式ドキュメント:
🏢CloudShell のネットワークアーキテクチャ
デフォルト CloudShell(VPC 非指定)
重要なネットワーク特性
- インバウンド通信 ❌
- アウトバウンド通信 ⭕
- パブリック IP ❌
これは公式に明言されています。
公式ドキュメント:
[Browser]
↓
[AWS Console]
↓
[CloudShell Environment]
└─→ AWS API / Internet(Outbound Only)
この設計により、CloudShell は
踏み台用途でも極めて安全 です。
✅VPC 統合 CloudShell(高度な利用)
VPC 統合で何が起きるか
VPC 統合 CloudShell では、
- 指定 VPC
- 指定サブネット
- 指定セキュリティグループ
を使って CloudShell 環境が起動されます。
AWS は裏側で ENI(Elastic Network Interface)を作成 します。
公式ドキュメント:
NAT がないとインターネットに出られない理由
CloudShell は パブリック IP を持たない ため、
- パブリックサブネット
- IGW あり
だけでは 外部通信不可 です。
公式に以下が明記されています。
VPC 環境の CloudShell でインターネットアクセスを行うには
NAT Gateway または NAT インスタンスが必要
公式ドキュメント:
VPC CloudShell の制限事項
- IAM プリンシパルあたり 最大 2 環境
- セキュリティグループは 最大 5 個
- 永続ストレージなし
- GUI からのファイルアップロード / ダウンロード不可
公式ドキュメント:
👑IAM 権限モデル
AWS 管理ポリシー(最短ルート)
AWSCloudShellFullAccess
公式ポリシー:
CloudShell 起動に必要な最低限の権限
cloudshell:CreateEnvironment
cloudshell:CreateSession
cloudshell:GetEnvironmentStatus
cloudshell:StartEnvironment
公式ドキュメント:
VPC 統合 CloudShell に必要な EC2 権限
ENI 作成のため、以下が必要です。
ec2:DescribeVpcs
ec2:DescribeSubnets
ec2:DescribeSecurityGroups
ec2:CreateNetworkInterface
ec2:CreateNetworkInterfacePermission
ec2:CreateTags
公式ドキュメント:
🕹️条件キーで CloudShell を制御する
CloudShell には専用条件キーがあります。
cloudshell:VpcIdscloudshell:SubnetIdscloudshell:SecurityGroupIds
公式ドキュメント:
例:特定 VPC のみ許可
"Condition": {
"StringEquals": {
"cloudshell:VpcIds": "vpc-12345678"
}
}