Amazon S3 ファイルゲートウェイでフォルダ階層を作ったときの S3 側の状況

# はじめに

お疲れ様です。矢儀 @yuki_ink です。

**S3 ファイルゲートウェイ、使ってますか？？**

S3 ファイルゲートウェイは、S3の存在を隠蔽して（S3を意識することなく）SMBでファイルサーバのようにS3にアクセスできる非常に便利なツールです。
が、S3を意識しなくていいために、ファイルゲートウェイを作って使い始めたあとに、S3側の状況がどうなっているか確認することはないと思います（私だけ？？）

ということで、今回はファイルゲートウェイの裏側のS3がどのようになっているか見ていきます。

なお、今回は以下の記事で作ったファイルゲートウェイの環境を流用して検証を行います。

https://qiita.com/yuki_ink/items/0956ef03c38cb5933efa


# 先に結論
- ファイルゲートウェイ上のフォルダ階層は、そのままマネジメントコンソールのS3画面上でも「フォルダ」として表示される
- フォルダ階層は `/` で表現される
- オブジェクトのS3 URIはこんな感じになる
`s3://(バケット名)/(フォルダ名)/(ファイル名)`
- オブジェクトのARNはこんな感じになる
`arn:aws:s3:::(バケット名)/(フォルダ名)/(ファイル名)`


**何も想像を裏切らない！！！！！w**


# やってみた
今回確認したいのは以下の2点です。

1. フォルダ階層を作ったときに、フォルダとファイルがS3側でどのように扱われるか
1. 日本語のフォルダ・ファイルは、S3側でどのように扱われるか


## ファイルゲートウェイでフォルダ階層を作る
Windowsでファイルゲートウェイをマウントして（ドライブレター：Y）、Exploreから手動で以下のフォルダ構造を作りました。
```
Y:\
│   text1.txt
│   日本語１.txt
│
├───folder1
│   │   text2.txt
│   │   日本語２.txt
│   │
│   └───foleder2
│           text3.txt
│           日本語３.txt
│
└───日本語
        text4.txt
        日本語４.txt
```
ファイルゲートウェイ直下がこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/fc67d015-5daf-439a-8226-92264d124b71.png)



## S3 側の状況を見てみる
ファイルゲートウェイと紐づくS3バケットを見てみます！

直下がこんな感じ。Exploreでの見た目と完全一致です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b73d5eec-2239-419d-aaf7-b383cfbf82f5.png)

`folder1` に潜ってみると、こんな感じ。これもExploreでの見た目と完全一致です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b020ec37-2f8c-4f5f-8e3f-207384cf7e4c.png)

さらに `folder2` に潜ってみると、これまた完全一致。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/63ff4746-9f6a-4055-b038-8e69b528da51.png)


`text3.txt` のS3 URIとAmazon リソースネーム (ARN)は以下の通りでした。

- S3 URI：`s3://standard-bucket-for-storage-gateway/folder1/foleder2/text3.txt`
- ARN：`arn:aws:s3:::standard-bucket-for-storage-gateway/folder1/foleder2/text3.txt`

ここから、フォルダ階層が `/` で表現されていることが分かります。

日本語のフォルダ、ファイルも同様でした。
`日本語３.txt` のS3 URIとAmazon リソースネーム (ARN)は以下の通りでした。

- S3 URI：`s3://standard-bucket-for-storage-gateway/folder1/foleder2/日本語３.txt`
- ARN：`arn:aws:s3:::standard-bucket-for-storage-gateway/folder1/foleder2/日本語３.txt`

また、日本語のフォルダ配下のファイルは、マネジメントコンソール上ではこのように表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/dc3f4726-c4f7-4eb9-b260-521073ebb793.png)

`日本語４.txt` のS3 URIとAmazon リソースネーム (ARN)は以下の通りでした。

- S3 URI：`s3://standard-bucket-for-storage-gateway/日本語/日本語４.txt`
- ARN：`arn:aws:s3:::standard-bucket-for-storage-gateway/日本語/日本語４.txt`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/390135a1-058f-42b2-85a4-b24374e9ab4e.png)
※オブジェクトURLの表記はさすがにエンコードされていますねw


というわけで結論ですが、
- ファイルゲートウェイ上のフォルダ階層は、そのままマネジメントコンソールのS3画面上でも「フォルダ」として表示される
- フォルダ階層は `/` で表現される
- オブジェクトのS3 URIはこんな感じになる
`s3://(バケット名)/(フォルダ名)/(ファイル名)`
- オブジェクトのARNはこんな感じになる
`arn:aws:s3:::(バケット名)/(フォルダ名)/(ファイル名)`


# 終わりに
まったく想像を裏切らない結果となりましたww

この結果が得られて何がうれしいかといえば、
例えば、「ファイルゲートウェイの○○フォルダにCSVファイルを置いたら、S3イベント通知でLambdaがキックされ、CSVが加工され、加工されたファイルが××フォルダに格納される」というようなことが、感覚的に容易に実装できます。
（参考）[S3 バケットに csv ファイルがアップロードされたら Lambda を動かしてみる](https://dev.classmethod.jp/articles/lambda-s3/)

▼S3イベント通知でプレフィックスを設定すれば、特定のフォルダを指すことができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/24cd1189-deb8-4813-81ce-662c35b72849.png)


最後までお読みいただき、ありがとうございました！