【AWS】“Aws::S3::Errors::AccessDenied in 〇〇sController#create”エラー（AWSのS3に保存されない）

# エラー内容

AWSのS3を使い、画像データを保存できるように実装していたが、
1. ローカル環境においてエラー
2. 本番環境においてエラー
3. AWSのS３上のバケットにはデータなし（保存されていない）
という事象が発生。

ローカル環境↓
![20201218error（ローカル環境）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696641/e0fe354d-2ae8-fab0-dac0-27abc12b86da.png)

本番環境↓
![デプロイエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696641/37258d14-eb85-5cd5-f151-c25540ac9fa5.png)

エラーが起こったときのターミナルのログ↓
![20201218error(ターミナル).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696641/93bb5528-7694-4c9b-2021-567709901012.png)



# エラーが起こったときの設定の状況

- macOS Catalina バージョン10.15.7
- Rails Rails 6.0.3.4
- Herokuを使ってデプロイ
- AWSのアカウント・IAMユーザー・S3のバケットの３つを新規作成したばかり

# 解決した方法（結論）

「AWSのアカウント削除→作成し直し」を行ったところ、エラー解決。
（保存できるようになった）

##### 解決方法の補足
- AWSアカウント作成時、Googleのシステム障害が発生していた。
- メンターさんにも見てもらいタイポや記述もれが無いのにも関わらず、保存ができなかった。
- アカウントの新規作成から1日以上、保存できない状況が続いた。（時間をおいても反映されない）
- AWSアカウントを削除して、新規登録し直す際、前回登録していたメールアドレスが９０日間以内であれば再開できる対象になるからか、使えない状況になる。（前回のメールアドレス以外を選択しないといけない）
- [こちら](https://teratail.com/questions/164250)の方法を試すも、今回は上手くいかなかった。



# AWSアカウント作成し直す前の確認作業

####　（１）AWS上のバケットポリシーは適切か？

結果：①②あたる部分は、ともに適切だった。

```
{
   "Version": "2012-10-17",
   "Id": "Policy1544152951996",
   "Statement": [
       {
           "Sid": "Stmt1544152948221",
           "Effect": "Allow",
           "Principal": {
               "AWS": "①今回のIAMユーザーのARNをここに記述"
           },
           "Action": "s3:*",
           "Resource": "arn:aws:s3:::②今回のバケット名をここに記述"
       }
   ]
}
```



####　（２）ブロックパブリックアクセスのバケット設定は適切か？

結果：適切だった。

![20201218バケットポリシーの確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696641/ae1ad170-32ba-ed29-5969-663e716c1d83.png)



####　（3）VSコード上の、保存先は適切か？

結果：適切だった。

`:amazon`になっているのでOK。（開発環境）

```ruby:config/environments/development.rb
  # Store uploaded files on the amazon file system (see config/storage.yml for options).
  config.active_storage.service = :amazon
```

`:amazon`になっているのでOK。（本番環境）

```ruby:config/environments/production.rb
  # Store uploaded files on the amazon file system (see config/storage.yml for options).
  config.active_storage.service = :amazon
```

”今回のバケット名”にあたる部分について、合っていたためOK。

```ruby:config/storage.yml
amazon:
  service: S3
  region: ap-northeast-1
  bucket: 今回のバケット名
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
```

####　（４）環境変数は適切か？

結果：適切だった。

##### 環境変数の確認方法(MacOSがCatalina以降の場合)

```terminal:terminal
vim ~/.zshrc
```
- `:wq`で閉じる。
- もし誤っていた場合には`i`を押して編集し、`esc`を押してから、`:wq`で閉じる。

##### コンソール確認
- `rails c`で立ち上げ。
- `storage.yml`に記載の変数名を入力。
![20201218コンソール確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696641/cf6ec2dd-62df-2ed5-f507-a400c051bd7a.png)


確認した内容は以上。

### AWSアカウント（ルートユーザー）を作り直し

上記の通り、確認したが誤りはない様子。
思い当たる仮説としては、「Googleの調子が悪い頃、ちょうどアカウント登録していた」だったため、アカウントを作り直すことにした。


1. [請求がゼロか確認](https://aws.amazon.com/jp/premiumsupport/knowledge-center/close-aws-account/)
2. [バケットの削除](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/delete-bucket.html)
3. [IAMユーザーの削除（今回はルートユーザーに紐づけて作成したため、無し）](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_groups_manage_delete.html)
4. [AWSアカウント（ルートユーザー）の削除](https://aws.amazon.com/jp/premiumsupport/knowledge-center/close-aws-account/)
（補足）リンク先は、１と同じ。

<br>

AWSを作り直したあとは、

- 環境変数の設定し直し
- バケットポリシーの設定し直し
が必要となる。


# 感想
- 今回のケースは、因果関係が定かではないが、「システム障害が起きている前後は、アカウントの作成をしないほうがよい」ことを学んだ。
- 今回はアカウントを新規作成したばかりで、作り直しの手間はかかるが、他に消えると困る設定をしていなかったのでラッキーだった。
- ２回作成したので、AWS作成の復習になった。


以上です。
同じように困った人の解決になれば幸いです。
（間違いあった時は、教えてください！）