この記事は、リレーブログ企画「24新卒リレーブログ」の記事です。
はじめに
こんにちは。はじめまして新卒1年目の藤岡です。
これから24新卒リレーブログをしていきます!
そんな私は現在ジョブローテ第一期にてISPオペレーションサブチームに配属され未知の情報の荒波にもまれています。
今回はRcloneでローカルPCからAWS S3にファイルを転送しようとした際にアクセス権限の付与で苦しんだお話をしていこうと思います。
やろうとしていること
- rcloneでローカルPCからs3にアクセス
- サーバー内のファイルをs3バケットにアップロード
- s3バケットにあるファイルを読み取る
したいことだけ見ると詰まるところがなさそうに思えます。
ということで早速ネットで同じことをしている人がいないか調べていきます。
Rcloneでs3をローカルPCにマウントしてみる | DevelopersIO
「rclone s3」と検索したところ、もう組み合わせるだけでいけそうな記事がありました。
早速記事通りに作業を進めていきます。
IAMユーザー
しばらく進めるとrclone configの設定でIAMユーザーの「アクセスキー」、「シークレットキー」の入力が求められます。
「IAMユーザーってなんぞや」
AWS初心者の私はこうなるわけです。調べましょう。
IAM(アイエム)ユーザーは、AWSのIdentity and Access Management(アイデンティティとアクセス管理)の機能の一つです。IAMユーザーは、AWSリソースへのアクセスや操作を行うために使用されるアカウントです。
なるほどAWSのリソースにアクセスするためにそれ専用のアカウントを作成しなければならないということですね。
ということでIAMユーザーを作成していきます。
が、作成しようとすると許可のオプションという設定を求められます。
「許可ってなんや、ポリシーってなんや」
また出ました。調べましょう。
IAM でのポリシーとアクセス許可
AWS でのアクセスを管理するには、ポリシーを作成し、IAM アイデンティティ (ユーザー、ユーザーのグループ、ロール) または AWS リソースにアタッチします。ポリシーは AWS のオブジェクトであり、アイデンティティやリソースに関連付けて、これらのアクセス許可を定義します。AWS は、IAM プリンシパル (ユーザーまたはロール) によってリクエストが行われると、それらのポリシーを評価します。ポリシーでの権限により、リクエストが許可されるか拒否されるかが決まります。
引用:https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html
なるほどリソースにアクセスするためのアカウントが「何に対して、何ができるか」とかの権限ということですね。
「何ができるか」については全てActionとして指定することで権限を付与することができるそうです。
では今回はs3のバケットに対してファイルのアップロードと読み取りをできるようにすればいいのでPutObject
とGetObject
の2つ付与すればいけそうです。
ということでポリシーを作成してユーザーにアタッチ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::バケット名/*", "arn:aws:s3:::作成したバケット名/フォルダ名/*" ] } ] } |
これで無事にIAMユーザーが作成できました。
そして肝心のアクセスキーとシークレットキーもユーザーページから発行できました。
ついに上の記事の作業が進みます。
その後は特に詰まることなくrcloneでローカルPCからs3にアクセスする設定が完了しました。
いざrclone copy
コマンド実行!
1 2 3 4 5 6 |
rclone copy C:\Users\xxxxx\xxxxx\xxxxx s3:作成したバケット名/フォルダ名 #実行結果 2024/xx/xx xx:xx:xx Failed to copy: Forbidden: Forbidden status code: 403, request id: xxxxxxxxxxxxxxxx, host id: xxxxAVBHF/hihccgvXxxxxxxFTFZOh/xx-GUKLvxxxxxxxxxxxxxxxxx |
「Forbidden」
アクセス拒否!?どこが間違ってるんや。と思いながら記事を見直すもどこも間違っているようには見えません。
どうやらアクセス権限がないと言われているようです。
PutObject
GetObject
以外にも必要なアクションがあるということですね。
最小権限の原則
他にどんなアクションがあるのか調べ中、「すべてのアクションの許可を付与する」みたいなフルアクセスというものがあるじゃないですか。
早速ポリシーをs3に対するフルアクセスに変えて実行。
そりゃできます。
最初からフルアクセスにしとけばよかったんや。なんて考えているとトレーナーの方から
「最小権限の原則というものがあってね」
セキュリティの観点から権限というものは必要なもの以外は付与しないことが望ましいというものらしい。そうしないと万が一アカウントが乗っ取られたりしたときに内部から侵略されてしまう。
ということで今回の処理における最小権限はどれなのかの調査が始まりました。
しかし、どれだけ調べても出てくるのは
「ファイルの書き込みに必要な権限はPutObject
、読み取りに必要なのはGetObject
。」
それに加えてs3に対するアクションの総数がまあまあな数あります。とてもじゃないですが1つ1つどんなアクションなのか調べるのは無理があります。
頭を抱えながら調べていると「AWS Cloud Trail」というサービスの存在を見つけました。
Cloud Trail
ログインなどのユーザアクティビティとAPI操作をログに記録するサービスです。AWS CloudTrailを利用することで、AWSアカウントのガバナンス、コンプライアンス、リスク監査などを行うことができます。そのため「いつ」「誰が」「何を」したのかをすぐさま確認することが可能です。
これでフルアクセスの時にs3に対してどんなアクションを起こしているのか調べれば足りないアクションが分かりそうです。
いざログ確認。
CreateBucket!?
なんとCreateBucket
というアクションが実行されていました。
どうやらrclone copy
では毎回同名のバケットを作り直しているそうです。
早速ポリシーに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:CreateBucket" ], "Resource": [ "arn:aws:s3:::*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::作成したバケット名", "arn:aws:s3:::作成したバケット名/フォルダ名/*" ] } ] } |
いざrclone copy
!
1 2 3 4 5 6 |
rclone copy C:\Users\xxxxx\xxxxx\xxxxx s3:作成したバケット名/フォルダ名 #実行結果 2024/xx/xx xx:xx:xx Failed to copy: Forbidden: Forbidden status code: 403, request id: xxxxxxxxxxxxxxxx, host id: xxxxAVBHF/hihccgvXxxxxxxFTFZOh/xx-GUKLvxxxxxxxxxxxxxxxxx |
「Forbidden」
まだか。しかしCreateBucket
が実行されていることから学んだことがあります。
実行するコマンドの処理について考えることが大切なのではないかということです。
実際にRcloneの公式ドキュメントにはrclone sync
コマンドを実行する際の最低限必要な権限が記載されています。
ここにも記載されているようにフォルダの同期を行うsync
コマンドではファイルの削除も行うためDeleteObject
などのアクションが必要になってきます。
ではrclone copy
はどんな処理をするコマンドなのでしょうか?
rclone copy
同期元と同期先で同じファイルはスキップするようコピーする。この時、同期元で削除したファイルは同期先で削除されないため、同期先の容量はどんどん膨らんでいることに注意
引用:https://www.phi.phys.nagoya-u.ac.jp/~fujiie/memo/rclone.html
copy
では同期元と同名のファイルが同期先にあるときはファイルの更新を行い、同期先にないときにはファイルを新しく同期先に作成しています。
ということはフォルダの中のオブジェクトの全てを一度参照していることになります。
現在のポリシーにはオブジェクトの一覧を参照できるアクションの権限はありませんのでアクション一覧から探します。
ListBucket:バケット内のオブジェクトの一覧を取得する
これが使えそうです。ポリシーに追加していきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:CreateBucket" ], "Resource": [ "arn:aws:s3:::*" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::作成したバケット名", "arn:aws:s3:::作成したバケット名/フォルダ名/*" ] } ] } |
満を持してrclone copy
!
1 2 3 4 |
rclone copy C:\Users\xxxxx\xxxxx\xxxxx s3:作成したバケット名/フォルダ名 #実行結果 |
ついにエラーなく実行できました。
AWSのコンソールにてs3バケットを確認するとローカルのファイルがs3バケット内にコピーされてると思います。
これでついにrcloneでローカルPCからs3にアクセスできたといえます。
お疲れさまでした。
おわりに
今回はAWSも触ったことがない、Rcloneとはなんぞやといった何もわからない状態で作業し始めたためIAMポリシーの規則などで詰まってしまいました。
AWS初心者の私はまずAWSリソース間でのアクセスに必要な権限で躓いてしまい、さらに外部アプリケーションを介することでさらに必要となる権限があるということの2点躓くポイントがありました。
前者の問題は色々な記事があるためネットで検索すると情報が出てきます。
しかし後者の問題は今回のように全く同じことをしている人が少ないことが多いです。
そこで実行したいコマンドがどういった処理をしているものなのかや、ログをたどることで対策できることもあると分かりました。
実際rcloneは実行するコマンドによって必須の権限があるため注意が必要ということが分かりました。
特に今回のrclone copy
では
GetObject
PutObject
ListBucket
CreateBucket
の4つは必須です。
今回の経験を活かして今後も実行したいものがどういった処理を行うものなのか考えながら業務に励んでいきたいと思います。
以上、新卒1年目がRcloneでAWSへアクセスするときの権限で苦しんだ話でした。
ありがとうございました。
次回は、keylium さんです。
ここから24新卒リレーブログ企画スタートです!
ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!
ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!
connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!