EC2 に SSM Session Manager で接続して、AWS CLI で S3 操作をひと通り(作成 → アップロード → ダウンロード → 削除)やろうとしました。まず aws s3 mb でバケット作成。
…成功🎉 よし次、とファイルをアップロード。
…Permission denied。え、バケットは作れたのに、アップロードだけ無理…?「権限が足りないのか?」とロールを疑い始めました。
犯人は権限(IAM)じゃなくて、「いま自分がいる場所」でした😅
「失敗しているのに、流れの中で見落としやすい」という地味に気づきにくいやつだったので残します。
環境
- AWS EC2(Amazon Linux 2023)
- 接続:SSM Session Manager(SSH の 22 番は開けない方針)
- AWS CLI v2(EC2 に標準で入っている)
- Amazon S3
- リージョン:ap-northeast-1
起きたこと
こんなコマンドを順に流しました(抜粋)。
aws s3 mb s3://my-study-bucket-xxxx --region ap-northeast-1
echo "hello from ec2" > test.txt
aws s3 cp test.txt s3://my-study-bucket-xxxx/
返ってきた出力がこれ。
make_bucket: my-study-bucket-xxxx
sh: test.txt: Permission denied
The user-provided path test.txt does not exist.
-
make_bucket→ バケット作成は成功 -
sh: test.txt: Permission denied→echo > test.txtでファイルが作れていない -
cp→ 「test.txt が存在しない」で失敗
作成は通ったのにアップロードだけコケる。これで「権限(ロール)かな?」と勘違いしました。
原因
まず現在地を確認したら、これでした。
$ pwd
/usr/bin
SSM Session Manager で入った直後、今回の環境では ssm-user として /usr/bin にいました。/usr/bin はコマンド本体が置かれるシステム用フォルダで、一般ユーザーに書き込み権限がありません。
そのうえで、各コマンドが「何に触るか」で結果が分かれていました。
| コマンド | 触る対象 | 書けない場所での結果 |
|---|---|---|
echo > test.txt |
ローカル(EC2 上)にファイルを作る |
Permission denied(作れない) |
aws s3 mb / aws s3 rb
|
S3 側だけ | 成功する(ローカルに触らない) |
aws s3 cp |
ローカルのファイルを読む/書く | 失敗する(元ファイルが無い/書けない) |
echo でファイルが作れない → その後の cp が「ファイルが無い」で失敗、というドミノ倒し。一方 mb/rb は S3 だけの操作なので平然と成功する。だから「作成・削除は通るのにアップロードだけ落ちる」となり、流れの中で原因が見えにくくなっていました。
ちなみに Permission denied(ローカルのファイル権限)と Access Denied(AWS 側の権限=IAM)は別物で、今回は前者。メッセージで切り分けられます。
対処:書ける場所に移動してから
/tmp は一時作業用の、誰でも書き込める場所です(ただし一時置き場なので、残したいファイルは cd ~ でホームに置く方が安全)。最初に移動するだけ。
cd /tmp
aws s3 mb s3://my-study-bucket-xxxx --region ap-northeast-1
echo "hello from ec2" > test.txt
ls -l test.txt
aws s3 cp test.txt s3://my-study-bucket-xxxx/
aws s3 ls s3://my-study-bucket-xxxx/
aws s3 cp s3://my-study-bucket-xxxx/test.txt downloaded.txt
cat downloaded.txt
aws s3 rb s3://my-study-bucket-xxxx --force
今度はアップロード → ダウンロードまで全部通りました。
学び
-
Permission denied(場所・ファイルの権限)とAccess Denied(IAM の権限)は別物。 エラーメッセージで切り分ける。 - コマンドをまとめて流すと、失敗が流れの中で見落としやすい。 各ステップの成功/失敗を 1 つずつ確認する。
-
SSM で接続した直後はいきなり作業しない。 まず
pwdで現在地を確認し、書ける場所(cd /tmpやcd ~)へ移動してから。 - プロンプトが
sh-5.2$のように素っ気ない時は、現在地が表示されないのでpwdが確実。
おわりに
「権限かな?」と身構えた瞬間こそ、まず pwd——という小さなメモでした😅 同じく「作成は通るのにアップロードだけ落ちる…?」で固まった人の参考になれば嬉しいです🙌