AWSを触ってみる【S3】
はじめに
AWSが提供する学習プラットフォームAWS Skill Builderの学習プランが11/2まで無料で急ぎでやってみたので学んだことをまとめます。
実際にAWSコンソールを開きながら進められるのでおすすめです。
※自分はAWSを業務で若干しか触ったことないレベルなのでほぼ初心者です。
S3とは
Amazon Simple Storage Service (Amazon S3) は、データを保存・管理するオブジェクトストレージサービスです。
S3の特徴
高い耐久性と可用性
耐久性:99.999999999%(イレブンナイン)の耐久性を持ち、データの損失リスクが極めて低いです。これは、データを複数のデータセンター(アベイラビリティゾーン(AZ))に自動的にレプリケーションして保存するためです。
従量課金制で必要な分だけ利用できる
データの保存量やリクエスト数に応じて課金されるため、小規模な利用から大規模システムまで柔軟に対応できます。
アクセス制御を柔軟に設定できる
どこまでデータを公開するか、誰のアクセスを可能とするかを細かく設定できます。
S3の用途
以下のような広範にわたるユースケースのデータを容量に関係なく、保存することができます。
- バックアップと復元
- 静的ウェブサイトのホスティング
- データアーカイブ
- 静的コンテンツの配信
- ログデータの保存
- データレイク(ビックデータ分析の元となる大量のデータの蓄積)
バケット
オブジェクトを格納するための「入れ物」です。
バケット名はグローバルで一意でなければなりません。
オブジェクト
バケットに格納されるデータ本体です。
テキストファイル、画像、動画、音声ファイルなど、様々な種類のデータを格納できます。
S3のアクセス制御
S3 では、アクセス権限を管理するために以下のような複数の仕組みが用意されています。
それぞれ役割や適用範囲が異なるため、目的に応じて適切に使い分けます。
- ブロックパブリックアクセス
- バケットポリシー
- ACL(アクセスコントロールリスト)
ブロックパブリックアクセス
バケット全体に対して、パブリックアクセスを一括で許可または拒否できる最上位のアクセス制御です。有効になっていると、バケットポリシーや ACL でパブリック設定を行っても無効化されます。
バケットポリシー
バケット全体または特定のパス(ディレクトリ)に対して、アクセスルールを JSON 形式で定義する仕組みです。
「誰が」「どの操作(Get、Put など)を」「どのリソース(ファイルやパス)に対して」行えるかを柔軟にコントロールできます。
ACL(アクセスコントロールリスト)
各バケットまたはオブジェクト単位で、公開・非公開を個別に設定する仕組みです。
IAMユーザー単位の細かいアクセス制御は行えず、基本的には「このオブジェクトをパブリックにする/しない」という単純な用途に限られます。
ただし、現在バケット作成時にACLを無効にすることを推奨されます。

S3を使う
バケットを作成する
-
AWSコンソールで「S3」を開く>バケットを作成>

-
以下の情報を設定する
- バケット名
- オブジェクト所有者
など
3. バケットを作成
バケットにオブジェクトをアップロードする
テキストファイル、写真、動画、zip ファイルといったあらゆる種類のファイルをオブジェクトにすることができます。
-
作成したバケットを選択
-
アップロード

-
ファイル追加>アップロードしたい画像選択>アップロード

オブジェクトを公開する (ブロックパブリックアクセスとACL)
アップロードしたオブジェクトURLを見にいくとこのようにアクセスが拒否されます。

これは、Amazon S3 のオブジェクトがデフォルトでプライベートになっているためです。
外部公開したい場合は、①バケットの「ブロックパブリックアクセス」設定と②ACL個別のオブジェクトをパブリックに設定の両方を変更する必要があります。
① バケットの「ブロックパブリックアクセス」設定を解除する
-
バケットの詳細の概要>アクセス許可>ブロックパブリックアクセス (バケット設定)
の編集

-
チェックボックスを外して変更の保存

② 個別のオブジェクトをパブリックに設定する(ACL)
続いて、公開したい オブジェクト単位でアクセス制御(ACL) を設定します。
- オブジェクト概要>オブジェクトアクション>ACLを使用して公開する
再びオブジェクトURLを見にいくと画像が公開されたことが確認できました。
バケットポリシーを作成する
バケットポリシーは、バケット全体または特定のパス(ディレクトリ)に対して、アクセスルールを JSON 形式で定義する仕組みです。これを使用して、バケット全体またはバケット内の特定ディレクトリへのアクセスをコントロールできます。
-
S3>該当のバケット>アクセス許可>バケットポリシー>編集

-
ポリシージェネレータをクリックし、タブを開く
バケットポリシーエディタ

ポリシージェネレーター(AWS Policy generator)

- PrincipalにIAMのARNを入力
Principal にはアクセスを許可したいエンティティ(IAMユーザーやロール)を指定します。
- EC2など特定のリソースに許可 → 対象ロールのARNを指定
- 全員に公開したい場合 →
*を指定
IAMのARNを確認する
IAM>ロール>該当のロールを選択
ARNをコピー

-
Actionsに許可するActionを選択
今回は「GetObject」と「PutObject」を選択

-
Amazon Resource Name (ARN)にバケットARN+
/*を入力
バケットARNに/*を付けることで、バケット配下のすべてのオブジェクトを対象にします。
バケットARNを確認する
バケットポリシー編集画面にに記載のバケットARNをコピー

-
入力したら「add Statement」で下のテーブルに追加される

-
「Generate Policy」でJSON形式でポリシーが生成

-
コピーし、バケットポリシーエディターに貼り付ける。

-
変更の保存
バケットポリシーを作成することができました。
ポリシーを保存すると、対象リソース(EC2やIAMユーザー)からS3へのアクセスが可能になります。
EC2インスタンスからS3に接続する(途中...)
先ほど作成したバケットポリシーをテストするために、EC2 インスタンスからのファイルのアップロードとダウンロードのテストを行います。
- EC2>EC2の実行中のインスタンスを選択>「接続」

セッションマネージャーを選択>「接続」

EC2 インスタンスに接続されました。
まとめ
さすがに難しくてまだ全然理解できていないです。
随時追記していきます。
Discussion