CloudShellとローカル環境でのAWS開発 - 使い分けと注意点

AWS Basic
スポンサーリンク
スポンサーリンク

はじめに

AWS開発を始めると、「ローカルPC(VSCode)」と「CloudShell」、どちらで作業するのが良いのか迷いませんか?

実は、それぞれに適した使い方があり、理解しないまま使うと思わぬトラブルに遭遇します。

この記事では、両環境の違いを明確にし、実際にハマったポイントを含めて解説します。


CloudShellとは?

AWSが提供するブラウザベースのシェル環境

CloudShellは、AWSマネジメントコンソール右上のアイコンからすぐに起動できるLinuxシェル環境です。

主な特徴:

  • AWS CLIプリインストール - 追加設定不要
  • 認証情報自動設定 - aws configure不要
  • ブラウザだけでOK - どこからでもアクセス可能
  • 無料 - 追加料金なし(一部制限あり)

制約:

  • セッション終了でファイルが消える - ホームディレクトリ以外
  • ネットワークIPが動的 - 毎回変わる可能性
  • エディタ機能が限定的 - VSCodeほど快適ではない

ローカル環境(VSCode)とCloudShellの使い分け

推奨される使い分け

作業内容ローカルVSCodeCloudShell
コード編集・開発
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-identity

CloudShell(正しい):

{
    "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のIP

SSH接続は成功。でも、ローカル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 がない

アップロード方法:

  1. CloudShellの「アクション」→「ファイルをアップロード」
  2. ローカルPCのmy-ec2-test-key.pemを選択
  3. 権限設定
chmod 400 my-ec2-test-key.pem

CloudShellで新しいキーペアを作成

# 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の違い

項目ローカルVSCodeCloudShell
コード編集◎ 快適△ 限定的
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プロジェクトのフォルダ整理で失敗しないために - ローカル環境の整理方法
AWSプロジェクトのフォルダ整理で失敗しないために - Python仮想環境の落とし穴
はじめにAWSでの開発を進めていくと、ec2-test、sam-api-project、my-serverless-appなど、プロジェクトフォルダがユーザーディレクトリ直下に散らばってしまいませんか?「そろそろ整理しないと...」と思って...
  • EC2セキュリティグループのIP制限で接続できない? - 真の送信元IP特定方法の詳細(ルーター管理画面での確認)
EC2セキュリティグループのIP制限で接続できない?真の送信元IPを特定する確実な方法
はじめにEC2インスタンスを構築し、セキュリティグループで自分のIPアドレスに制限したのに、なぜかSSH接続もWebアクセスもできない。そんな経験はありませんか?実は、一般的なIP確認方法(curlや確認くん)で表示されるIPアドレスと、実...

終わりに

CloudShellは便利なツールですが、ローカル環境とは異なる特性を持っています。

特に、動的IPアドレスとEC2内部での権限エラーは、初見で必ずハマるポイントです。

両環境の違いを理解して、適切に使い分けることで、効率的なAWS開発が可能になります。

この記事が、CloudShellとローカル環境の使い分けで迷っている方の助けになれば嬉しいです!

質問や補足があれば、コメント欄でお気軽にどうぞ!

コメント