はじめに
AWS開発を始めると、「ローカルPC(VSCode)」と「CloudShell」、どちらで作業するのが良いのか迷いませんか?
実は、それぞれに適した使い方があり、理解しないまま使うと思わぬトラブルに遭遇します。
この記事では、両環境の違いを明確にし、実際にハマったポイントを含めて解説します。
CloudShellとは?
AWSが提供するブラウザベースのシェル環境
CloudShellは、AWSマネジメントコンソール右上のアイコンからすぐに起動できるLinuxシェル環境です。
主な特徴:
- ✅ AWS CLIプリインストール - 追加設定不要
- ✅ 認証情報自動設定 -
aws configure不要 - ✅ ブラウザだけでOK - どこからでもアクセス可能
- ✅ 無料 - 追加料金なし(一部制限あり)
制約:
- ❌ セッション終了でファイルが消える - ホームディレクトリ以外
- ❌ ネットワークIPが動的 - 毎回変わる可能性
- ❌ エディタ機能が限定的 - VSCodeほど快適ではない
ローカル環境(VSCode)とCloudShellの使い分け
推奨される使い分け
| 作業内容 | ローカルVSCode | CloudShell |
|---|---|---|
| コード編集・開発 | ◎ | △ |
| CloudFormation操作 | ◎ | ◎ |
| AWS CLI実行 | ◎ | ◎ |
| 外出先からの緊急対応 | × | ◎ |
| ファイルのバージョン管理 | ◎ | △ |
| 長時間の作業 | ◎ | △ |
私の使い方
平常時: ローカルVSCodeで開発
- コード編集、Git管理、ビルド、デプロイまで
外出先・緊急時: CloudShell
- 素早くインスタンス停止、ログ確認など
CloudShellで同じEC2を構築してみた
手順は同じ...はずだった
ローカルVSCodeで構築したEC2を、CloudShellでも同じように構築してみました。
# template.yamlをアップロード後
aws cloudformation create-stack --stack-name ec2-test-stack --template-body file://template.yaml --region ap-northeast-1 --capabilities CAPABILITY_IAMスタック作成は成功。さて、SSH接続してみると...
ssh -i my-ec2-test-key.pem ec2-user@18.183.169.96
# ssh: connect to host 18.183.169.96 port 22: Connection timed outあれ?接続できない。
ハマったポイント1: CloudShellのIPアドレスは別物
問題の原因
セキュリティグループに設定していたIP123.456.78.901は、ローカルPCのIP(ルーター管理画面で確認)でした。
CloudShellはAWS内部の別のIPアドレスから接続するため、当然ブロックされます。
CloudShellの現在のIPを確認
# CloudShellで実行
curl https://checkip.amazonaws.com
# 結果: 52.68.8.99このIPアドレスを確認して、セキュリティグループに追加する必要があります。
さらなる問題:CloudShellのIPは頻繁に変わる
CloudShellのIPアドレスはセッションごとに変わる可能性があります。
今日のセッション: 52.68.8.99
明日のセッション: 54.XX.XX.XX (変わっている!)実用的な対処法:
対処法1: 毎回IPを確認して更新
# 1. CloudShellの現在のIPを確認
curl https://checkip.amazonaws.com
# 2. セキュリティグループに追加
aws ec2 authorize-security-group-ingress --group-id sg-XXX --protocol tcp --port 22 --cidr 新しいIP/32 --region ap-northeast-1対処法2: CloudShell用に広めの範囲を許可
# AWSのCloudShell IP範囲を許可(推奨はしない)
CidrIp: 52.0.0.0/8対処法3: Session Managerを使う(推奨)
# SSH不要、IP制限不要
aws ssm start-session --target i-XXX --region ap-northeast-1ハマったポイント2: SSH接続したままコマンド実行
セキュリティグループを変更しようとしてエラー
CloudShellでEC2にSSH接続後、セキュリティグループを更新しようとしました。
[ec2-user@ip-172-31-34-41 ~]$ aws ec2 revoke-security-group-ingress --group-id sg-XXX ...
An error occurred (UnauthorizedOperation) when calling the RevokeSecurityGroupIngress operation:
You are not authorized to perform this operation.なぜ?CloudShellなら権限があるはずでは?
原因:EC2インスタンス内部で実行していた
プロンプトをよく見ると:
[ec2-user@ip-172-31-34-41 ~]$ # EC2内部CloudShellではなく、EC2インスタンスにSSH接続した状態でした。
EC2インスタンスのIAMロールには、セキュリティグループ変更権限がありません。
正しい手順
# 1. EC2から抜ける
exit
# 2. CloudShellに戻ったことを確認
~ $ # CloudShellのプロンプト
# 3. AWS CLIを実行
aws ec2 revoke-security-group-ingress --group-id sg-XXX --protocol tcp --port 22 --cidr 0.0.0.0/0 --region ap-northeast-1
# 成功!確実な確認方法
# 現在のアカウント情報を確認
aws sts get-caller-identityCloudShell(正しい):
{
"Arn": "arn:aws:iam::975049949619:user/ユーザー名"
}EC2内部(NG):
{
"Arn": "arn:aws:sts::...:assumed-role/ec2-test-stack-EC2Role/..."
}ハマったポイント3: SSH接続とWebアクセスのIP設定
セキュリティグループの設定ミス
CloudShellからSSH接続するために、ポート22とポート80の両方にCloudShellのIPを設定しました。
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 52.68.8.99/32 # CloudShellのIP
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 52.68.8.99/32 # CloudShellのIPSSH接続は成功。でも、ローカルPCのブラウザでWebアクセスすると...タイムアウト。
原因:ブラウザはローカルPCから
当たり前ですが、ブラウザはローカルPCから接続します。CloudShellからではありません。
正しい設定
SecurityGroupIngress:
# SSH: CloudShellから接続
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 52.68.8.99/32 # CloudShellのIP
# HTTP: ローカルPCのブラウザから接続
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 123.456.78.901/32 # ローカルPCのIP(ルーター管理画面で確認)CloudShellでの真のIP確認方法
ローカルVSCodeがない環境で、ローカルPCのブラウザ用の真のIPを確認する方法です。
手順
ステップ1: ポート80を一時的に全開放
# CloudShellで実行
aws ec2 authorize-security-group-ingress --group-id sg-XXX --protocol tcp --port 80 --cidr 0.0.0.0/0 --region ap-northeast-1ステップ2: ローカルPCのブラウザでアクセス
http://EC2のパブリックIPステップ3: CloudShellからEC2に接続してログ確認
# CloudShellからSSH接続
ssh -i my-ec2-test-key.pem ec2-user@18.183.169.96
# Apacheのアクセスログを確認
sudo cat /var/log/httpd/access_log | tail -5出力例:
123.456.78.901 - - [14/Jan/2025:12:34:56 +0000] "GET / HTTP/1.1" 200 ...この123.456.78.901がローカルPCのブラウザからの真の送信元IPです。
ステップ4: セキュリティグループを制限
# EC2から抜ける
exit
# CloudShellで実行
# 全開放を削除
aws ec2 revoke-security-group-ingress --group-id sg-XXX --protocol tcp --port 80 --cidr 0.0.0.0/0 --region ap-northeast-1
# 真のIPを許可
aws ec2 authorize-security-group-ingress --group-id sg-XXX --protocol tcp --port 80 --cidr 123.456.78.901/32 --region ap-northeast-1さらに簡単な方法:ルーター管理画面
実は、ローカルPCのIPはルーター管理画面で確認するのが最も簡単です。
1. ブラウザで http://192.168.0.1 を開く
2. 「インターネットIPアドレス」を確認
3. そのIPをセキュリティグループに設定詳しくは関連記事をご覧ください。
キーペアの管理
CloudShellにキーペアファイルをアップロード
ローカルPCで作成したキーペア(.pem)は、CloudShellには存在しません。
# CloudShellで確認
ls -la
# my-ec2-test-key.pem がないアップロード方法:
- CloudShellの「アクション」→「ファイルをアップロード」
- ローカルPCの
my-ec2-test-key.pemを選択 - 権限設定
chmod 400 my-ec2-test-key.pemCloudShellで新しいキーペアを作成
# CloudShell内で新規作成
aws ec2 create-key-pair --key-name cloudshell-key --query "KeyMaterial" --output text > cloudshell-key.pem
chmod 400 cloudshell-key.pem
# ダウンロード(ローカルPC用)
# CloudShellの「アクション」→「ファイルをダウンロード」まとめ
CloudShellとローカルVSCodeの違い
| 項目 | ローカルVSCode | CloudShell |
|---|---|---|
| コード編集 | ◎ 快適 | △ 限定的 |
| Git管理 | ◎ 完全対応 | △ 基本のみ |
| 認証設定 | 手動(初回のみ) | 自動 |
| ファイル永続性 | ◎ 永続 | △ ホームのみ |
| 接続元IP | 固定的 | 動的(変わる) |
| 外出先利用 | × | ◎ |
重要なポイント
✅ CloudShellのIPアドレスは動的
- セッションごとに変わる可能性
✅ SSH接続とWebアクセスは別のIPを設定
- SSH: CloudShellのIP
- HTTP: ローカルPCのIP(ルーター管理画面で確認)
✅ EC2内部でAWS CLIを実行しない
- 権限エラーになる
- 必ずCloudShellに戻って実行
✅ キーペアファイルは別管理
- CloudShellにアップロードが必要
✅ 真のIP確認はルーター管理画面が最も簡単
http://192.168.0.1で確認
推奨ワークフロー
開発フェーズ: ローカルVSCode
コード編集 → Git管理 → ビルド → デプロイ運用・トラブル対応: CloudShell
素早くログイン → 状態確認 → 必要な操作IP制限設定:
SecurityGroupIngress:
# SSH: CloudShell用(動的IPなので都度更新が必要)
- FromPort: 22
CidrIp: CloudShellのIP/32 # curl https://checkip.amazonaws.com
# HTTP: ローカルPC用(ルーター管理画面で確認)
- FromPort: 80
CidrIp: ローカルPCのIP/32 # http://192.168.0.1関連記事
- AWSプロジェクトのフォルダ整理で失敗しないために - ローカル環境の整理方法

- EC2セキュリティグループのIP制限で接続できない? - 真の送信元IP特定方法の詳細(ルーター管理画面での確認)

終わりに
CloudShellは便利なツールですが、ローカル環境とは異なる特性を持っています。
特に、動的IPアドレスとEC2内部での権限エラーは、初見で必ずハマるポイントです。
両環境の違いを理解して、適切に使い分けることで、効率的なAWS開発が可能になります。
この記事が、CloudShellとローカル環境の使い分けで迷っている方の助けになれば嬉しいです!
質問や補足があれば、コメント欄でお気軽にどうぞ!
コメント