iPhoneからS3を操作したい

# 動機
僕は毎月Googleフォトにお金を払ってiPhoneに保存している写真のバックアップを取っています。
普段クラウドエンジニアとしてS3を利用していて、料金が安いことを知っているのに、安直にGoogleフォトに課金するのはおかしい！S3を自分用のクラウドストレージとすれば安いのでは？~~何ならビジネスチャンスか~~と思い、iPhoneからS3に簡単にアップロードできる構成を構築してみました。

# 結論
正直今から作成する構成には良くないところがあり、下記の構成を再現するメリットがありません。
動機に記載した夢も潰えていて、運用に耐えうるものではないため、参考程度に見ることを推奨します。
詳細は[結果](#結果)の段落と[感想](#感想)の段落に記載があります。

# 今回の構成
### 用意するもの
・S3バケット
・S3接続用IAMユーザ
・S3接続用クライアントアプリ（サードパーティ製・有料）

### 作成の手順
1. IAMユーザを作成し、S3バケットに対する権限を付与する
1. 作成したユーザでアクセスキーを作成する
1. S3バケットを作成する
1. 作成したユーザからのみアクセス可能になるようバケットポリシーを作成する
1. iPhoneにS3接続用クライアントアプリを導入する
1. 作成したIAMユーザのアクセスキーを格納する
![スクリーンショット 2024-07-20 155821.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759299/2f577b7b-328b-e211-7210-df03c3969ab9.png)

# AWS環境の準備
### IAMユーザの作成

1. 下記のポリシーを作成しておきます。名前等はお好みで問題ないです。

   :::note warn
   注意
   本来はS3フルアクセスを付与する必要はないはずですが、
   面倒なのでここではフルアクセスを与えています。
   :::

   ```IAMPolicy.json: 
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "S3Access",
                "Effect": "Allow",
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::作成するバケット名",
                    "arn:aws:s3:::作成するバケット名/*"
                ]
            }
        ]
    }
   ```
1. IAMユーザの作成
    1で作成したIAMポリシーをアタッチしたユーザを作成します。
1. IAMアクセスキーの作成
    2で作成したユーザのアクセスキーを作成します
    ここで作成したアクセスキーはのちに使用するので控えておきます。
    これでIAM関連の作業は終了になります。

### S3バケットの作成
1. S3バケットを作成する（ほぼデフォルト）
1. バケットポリシーを設定する

   ```BucketPolicy.json: 
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Deny",
                "NotPrincipal": {
                    "AWS": [
                        "arn:aws:iam::アカウントID:user/作成したユーザ名"
                    ]
                },
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::作成したバケット名",
                    "arn:aws:s3:::作成したバケット名/*"
                ]
            }
        ]
    }
   ```
1. ブロックパブリックアクセスを設定する。
    今回はインターネットからのアクセスを許可するため、パブリックアクセスを許可する。
1. ![スクリーンショット 2024-07-20 163023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759299/5e87ca18-1dab-fbe0-5287-2e49de2a9a51.png)

# クライアント側環境の準備
### クライアントアプリのインストール
1. 下記のアプリをインストールする。（執筆時は300円買い切り）
    https://apps.apple.com/jp/app/aws-s3-manager/id1352683230
1. クライアントアプリ内の設定を実施する。
    Access Key ID：作成したユーザのアクセスキーを設定
    Secret Key：作成したユーザのシークレットアクセスキーを設定
    Bucket：作成したバケット名を設定
    ![image0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759299/307b988a-ac2d-8424-61ed-06ca9cdbca9d.jpeg)
1. Connectを押下するとバケット内に格納したファイルを確認することができ、付与した権限の操作が可能になる。

# 結果
思い描く構成は作成することができました。
ただし当初の目的であるGoogleフォトより安くクラウド環境にバックアップをするという目的は達成されたのでしょうか。

[ざっくりAWS](https://aws-rough.cc/s3/ "ざっくりAWS")で調べてみたところ、200GB,データ転送量1GB,読み込み回数100,書き込み回数100の場合は<font color="Red">796円/月</font>でした。

対してGoogleフォトの場合は200GBで<font color="Red">350円/月</font>と半額以下の金額で済みます。
（何なら年払いだともっとお得）

つまり結果としては当初の目的を達成できず、<font color="Red">何なら割高になるため実用性は何もないです</font>

# 感想
正直今回の検証はあまりよろしくないところがいくつかありました。
1. 事前にS3の料金をしっかり調査していない
1. ユーザにS3フルアクセスを付与している（ベストプラクティスに沿わない）
1. 信頼できるか分からないサードパーティー製のアプリにアクセスキーを入力している

などなど、枚挙に暇がないですね。
バケットポリシーの書き方などは勉強になったので良しとしましょう。
この構成をこのまま実施するのではなく、大人しく既存のサービスを利用することをお勧めします。

# 参考
https://dev.classmethod.jp/articles/tsnote-deny-bucket-policy-except-specific-iam-resource/

https://climbing.on-sight.biz/webtech/2788/

https://aws-rough.cc/s3/

https://aws.amazon.com/jp/s3/pricing/