AWSのIAM/CloudWatch/S3

- Udemyの[AWS Certified Solutions Architect - Associate 2020](https://www.udemy.com/course/aws-certified-solutions-architect-associate/)を受講した備忘録。
- 自分にとってのメモですので、網羅的にまとめているわけではありません。

# IAM

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/26b113e6-a7b6-8617-8f10-8377c83d844c.png)

- rootアカウントbillingのみに使用。


# [AWS Organizations](https://qiita.com/akiray03/items/07e9a786d1cc054f4e22) & Consolidated(統合された) Billing

- Organization Unit = Accountの集合
    - マスターアカウントから作っていくことができる
    - Billingが統合される
- Orgamization Unitには(単体のAccountと同様に)SCP(ServiceControlPolicies)で有効/無効を切り替えられる。

# CloudWatchとSNSでbilling alarmを通知するシステム

## CloudWatch
- ６時間ごとの累計(各瞬間ででの6時間累計かも?)の請求額が$10を超過したらSNSのトピック(`BillingAlarm`と命名した)に通知を送る。
    - 細かい設定の定義は[こちら](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html)を参考にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/0de8472a-9d01-996b-a334-48b825abe0ae.png)

## SNS(Simple Notification Service)
- どのemailに通知を送るかはこちらで設定することになる。



# S3

- Object(in a Bucket)
    - key(ファイル名)
    - value(データ、0~5TB)
    - **version**
    - metadata
    - [SubResource](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/ObjectAndSoubResource.html)
        - access control list
        - torrent??
## Data Consistency Model
- [ReadAfterWrite](http://e-words.jp/w/%E3%83%AA%E3%83%BC%E3%83%89%E3%82%A2%E3%83%95%E3%82%BF%E3%83%BC%E3%83%A9%E3%82%A4%E3%83%88.html) consistency(新しいオブジェクトをPUTで新規作成する時にその場で即座に確認)
    - Eventual consistency(既存のオブジェクトをPUTやDELETEで更新する時にはちょっと時間かかる)
    - つまり他のアクセス者がolder versionを取得することがありうる。

- PUTに成功したらHTTP Status=200を得る
- DELETEのためにMFAを設定できる 

## Storage Class Tier(オブジェクトごとに設定可能)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/8ba4e9e6-e134-b045-7571-1a18c1d1c2db.png)
※ IA = Infrequently Access
※ Glacier = 氷河、すなわちアーカイブされたデータ(Deepは取得により時間がかかる(12時間)がより安くなる)
※ Intelligent-Tiering = 機械学習で最適のTierを選択してくれる
※ OneZone以外は3つ以上のAZに保存される。OneZoneは1つのAZの中で冗長性を保つ。

## [Charge](https://aws.amazon.com/jp/s3/pricing/)
- Storage
- Requests & DataRetrieval
    - インターネット上のクライアントからのリクエストに応じて課金(バケットからのin/outによる料金のことではない)
    - DELETE リクエストおよび CANCEL リクエストは無料です。
- StorageManagePricing
- DataTransferPricing
    - Transfer(AWSのサービスにデータをin/outすること)時に発生する
    - すなわち、(1)S3バケット間のデータ転送、(2)S3とEC2などのデータのやりとり、(3)ユーザーからのアップロード、いずれでも発生。
    - S3の関してはinは無料である。outにのみ課金される。

- TransferAccelaration
    - 上記のDataTransferをより高速で行う。以下の時に使うべし。
    - 中央のバケットに対して世界中のお客様からアップロードが行われる場合。(アップロード時にEdgeLocationにファイルがアップロードされ、そこから最短距離でS3に転送されるので速い)
    - 大陸間で定期的にギガバイトからテラバイト単位のデータを送信する場合
- Same/Cross-RegionReplicationPricing
    - **非同期で**複製される
    - Sameの方は比較的新しく追加された機能


## AccessControlListとAccessPolicyでデータアクセスを制限
- オブジェクト、バケツのそれぞれでpublicかを設定できる(はず)


## Encryption
- クライアントサイドで頑張る
- 通信観でHTTPS
    - SSL/TLS
- サーバーサイドで頑張る(SSE=ServerSideEncryption)
    - SS3-S3(S3 ManagedKeys)
    - SSE-KMS(AWS KeyManagedServiceのManagedKey)
    - SSE-C(AWSにCustomerProvidedKeyを持ち込む)


## Versioning
- 一度オンにしたらオフにできない。Suspendedにしかならない。
- publicのファイルと同名のファイルをアップロードして新バージョンを作ってもpublicにはならない
- 容量が雪だるましきに増えるので注意する。
    - Versioningオフにするとか
    - LifecyclePolicy設定するとか
- Versioningがオンの時にファイル名からファイルを削除したら、`Deleted marker`という新しいバージョンが増えるだけ。全てのversionを一つずつ消す必要がある。
- MFA DELETEと提携することで、セキュリティ強化できる?


## Lifecycle Management

- 指定した時間が経ったら(1)オブジェクトのtier(StorageClass)を変化させたり、(2)オブジェクトをexpireさせたりできる
- LifeCycleのRuleを作成する
    - Storage class transition
    - Configure expiration

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/a17ebbcc-07c8-551b-8250-569bbecacf26.png)


## S3-Cross-Account Access
アカウントをまたいでS3のリソースにアクセスするには以下の方法がある。(最初の2つはProgramatic Access Only)

1. Bucket Policy & IAM(to entire bucket)の組み合わせ
2. Bucket ACLs(オブジェクトごとに設定) & IAM(to individual object)の組み合わせ
3. (Cross-accountで)対象のS3オブジェクトにアクセスできるIAM Roleを他のアカウントに与える(他のアカウントを`リソース`として見る)

### 3のやり方
1. 振り分け元のアカウントで、`S3_Cross_Account_Access`と言うロールを作る。
    - このロールのPolicyは`AmazonS3FullAccess`とする。
    - このロールのTrustedEntityはAccountにし、S3アクセスを振り当てたいアカウントのIDを入力する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/46271e4a-1ec2-7e0c-b642-f6f1e87a47bb.png)
1. サインアウトして、振り分け先のアカウントのユーザーでログイン。
    - ルートユーザーでログインしても、どうやら切り替えできないようだ...？
    - このアカウントでIAMでRoleの一覧を見ても`S3_Cross_Account_Access`というロールは含まれていないようだ...?
    - また、このロールを明示的にどれかしらのUserやGroupに与えるという操作は不要のようだ...?
1. そのUserで、コンソールのヘッダーからSwitchRoleを選択する。以下の画面で、`アカウント=振り当て元のアカウントID`、`ロール=S3_Cross_Account_Access`を入力する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/482c4c32-9916-4545-59c9-04de76a07951.png)
    - 1の画像の`Give this link to users who can switch roles in the console`のアカウントでもOKなはず...(だがうまくいかなかった)

(c.f) [AWS Organizations を実際に初めてみる第一歩](https://qiita.com/akiray03/items/07e9a786d1cc054f4e22)ではフルアクセスのRoleを与えている。

## Cross-Region Replication

<img width="796" alt="Screen Shot 2020-06-07 at 6.38.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/e912bdf3-7ac4-6245-a508-fd9a15baeceb.png">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/bf830408-e62f-b488-9f6a-16ba442178d1.png)


- 複製元のバケットのVersioningをオンにする必要がある。
- 複製時にすでに複製元のバケットの中に入っているオブジェクトは複製されない。
- その後複製元のバケットにPUTされたオブジェクトはレプリカバケットに複製される。
- 複製元でDELETE markerがつけられても他のバケットに反映されない（AWSが意図的にそうした）

## S3 Transfer Acceleration
ファイルをアップロードしたらエッジロケーションのCloudFrontから最短距離のルートが選択され、指定のS3バケットに転送される。
- [Amazon S3 Transfer Acceleration
Speed Comparison](https://s3-accelerate-speedtest.s3-accelerate.amazonaws.com/en/accelerate-speed-comparsion.html)でAccelerationを使った時と使わなかった時の速度比較が表示される。