■S3
※可用性の高い、オンラインストレージ(ファイルサーバ)を利用できる
「S3 → バケットを作成」からバケットを作成
バケット名: refirio
リージョン: アジアパシフィック(東京)
パブリックアクセス設定: 各チェックを外して公開
バケットポリシー:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::refirio/*"
}
]
}
※Bucket Name は「net.refirio.images」「net.refirio.backup」のように、URLをベースにすると他と重複しなくていいかもしれない
問題なければ「バケット」ボタンを押す
■S3のファイルを直接公開しない
Amazon S3 → happy-ring-production → アクセス許可 → ブロックパブリックアクセス (バケット設定) → 編集
で「パブリックアクセスをすべて ブロック」にチェックを入れて保存した
つまり、S3の画像を直接公開しないようにした
■サーバサイドプログラムからS3にファイルをアップロード
画面右上のアカウント名 → マイセキュリティ資格情報 → Delete your root access keys → Manage Security Credentials
Your Security Credentials ページの Access Keys (Access Key ID and Secret Access Key) でアクセスキーを作成できるので、控えておく
http://j-caw.co.jp/blog/?p=1100 などを参考に、S3にファイルをアップロードできるプログラムを作成して動作確認する
インスタンス一覧からインスタンスを選択し、指定したフォルダ内に指定したファイルをアップロードできているか確認する
ファイルを選択し、Properties → Link で、実際にアップロードされたファイルにアクセスできる
Access Key ID : XXXXX
Secret Access Key : YYYYY
http://develop-123456789.ap-northeast-1.elb.amazonaws.com/s3/
ただし基本的にルートキーは使用せず、限定的な権限を持つユーザーを作成することを推奨
画面右上のアカウント名 → マイセキュリティ資格情報 → ユーザー → ユーザーを追加
ユーザー名: refirio-production
アクセスの種類: プログラムによるアクセス
アクセス権限を設定: 既存のポリシーを直接アタッチ
のようにして、「EC2とS3にだけアクセスできる」のように作成する
awsのs3を操作する為のaccess keyとsecret keyを取得する(IAM) - joppot
https://joppot.info/2014/06/14/1621
ユーザーをいくつも作成する場合、権限をグループで管理するといい
AWSアクセスキー作成 - Qiita
https://qiita.com/miwato/items/291c7a8c557908de5833
PHPプログラムからS3にアップロードする場合、バケットの
「アクセス権限 → パブリックアクセス設定 → 編集」
で各チェックを外して「保存」とすると、SDKでアップロードする際
$client = S3Client::factory(array(
'key' => 'XXXXX',
'secret' => 'YYYYY',
));
$result = $client->putObject(array(
'ACL' => 'public-read',
'Bucket' => 'refirio-staging',
'Key' => 'images/photo01.jpg',
'Body' => file_get_contents('images/photo01.jpg'),
));
のように「ACL」を「public-read」にすればファイルを公開できる
また、バケットのプロパティの
「アクセス許可 → バケットポリシー」で以下を登録すると、「ACL」を「public-read」に指定しなくてもファイルがデフォルトで公開される
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*"
}
]
}
HDDに保存するのはもう古い!Amazon S3を使ってみたら簡単便利すぎてHDDが蒸発した
http://www.4-fusion.jp/randd/2013/05/08/hdd-old-amazon-s3-easy/
AWS SDK for PHPを使ってS3にファイルをアップロードする
http://j-caw.co.jp/blog/?p=1100
Installing via Composer
http://docs.aws.amazon.com/aws-sdk-php/guide/latest/installation.html
AWS SDK for PHP
http://aws.amazon.com/jp/sdkforphp/
Amazon S3 でバケット配下を全て public read にする
http://www.bokukoko.info/entry/2015/02/03/Amazon_S3_%E3%81%A7%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E9...
■画像の表示
※未検証
S3に配置した画像のURLに直接アクセスすると、ダウンロードダイアログが表示される
(imgタグで呼び出せば普通に画像が表示される)
AWSコンソールからオブジェクトのプロパティを確認すると、「メタデータ」に以下が設定されている
これがデフォルト値だと思われる
タイプ: システム定義
キー: Content-Type
値: binary/octet-stream
例えば画像がJpegの場合、以下のように設定することで、画像のURLに直接アクセスするとブラウザに表示されるようになる
タイプ: システム定義
キー: Content-Type
値: image/jpeg
SDK経由なら、オブジェクトをputする際にメタデータを指定できるみたい
AWS S3 の putObject API でメタデータを設定する - 銀の弾丸
https://takamints.hatenablog.jp/entry/set-metadata-with-aws-s3-putobject
CLI経由でも処理できるみたい
AWS CLI で S3 オブジェクトのメタデータを変更する - michimani.net
https://michimani.net/post/aws-modify-metadata-of-s3-object/
AWS CLIでS3 objectsへメタデータを設定する - Qiita
https://qiita.com/yohachi/items/7b91fcc441b2ccf4da87
【小ネタ】S3オブジェクトのContent-TypeをAWS CLIで一括で変更する | DevelopersIO
https://dev.classmethod.jp/articles/change-content-type-by-aws-cli/
■データ転送量の確認
S3 → バケットを選択 → 管理 → メトリクス
左メニュー内にある鉛筆アイコンをクリック
「リクエストのメトリクス」「データ転送のメトリクス」にチェックを入れて「保存」をクリック
(片方にチェックを付けると、もう片方も強制的にチェックが付いた)
CloudWatch → メトリクス → S3 → 各フィルターのメトリクスをリクエスト
で上で追加したメトリクスを確認できる
表示されていない場合はしばらく待つ。(「リクエストのメトリクス」「データ転送のメトリクス」の設定が反映されるまでに、15分程度のタイムラグがある)
S3データ転送量のアラート設定 | ハックノート
https://hacknote.jp/archives/54254/
■CLIで操作
CLIを使えば、バケットから一括ダウンロードや一括アップロードすることができる
詳細は、このファイル内にある「AWS CLI」の「S3を操作」を参照
■バケットの再作成
バケットを削除した後、すぐに同じ名前でバケットを作成しようとすると
「A conflicting conditional operation is currently in progress against this resource. Please try again.」
のようなエラーになる
複数リージョンに分散配置されたデータが消えるまで時間がかかるようなので、1〜2時間ほどしてから再度試すといい
AWS S3 で bucket を削除した後に再作成を試みるとうまくいかない|Sheeprograming
http://sheeprogramming.iku4.com/Entry/269/
■静的サイトホスティング
※未検証
S3に静的ページを配置し、それをWebサイトとして表示させることができる
ただしPHPなど動的ページに対応させることはできない
対象バケットの「プロパティ → 静的ウェブサイトホスティング」から設定できそう
Amazon S3 を使用して静的ウェブサイトをホスティングする - Amazon Simple Storage Service
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/WebsiteHosting.html
> Amazon S3 はサーバーサイドスクリプトをサポートしていませんが、
> AWSには動的ウェブサイトをホストするための他のリソースがあります。
動的ページには対応していないので、別途EC2などを使用する必要がある
CloudFrontとS3で作成する静的サイト構成の私的まとめ | DevelopersIO
https://dev.classmethod.jp/articles/s3-cloudfront-static-site-design-patterns-2022/
■バージョン管理
※未検証
今さらだけどS3のバージョニングを試してみた。
https://qiita.com/kooohei/items/8775b380632e8b7940a3
■セキュリティ
※未検証。2018年11月18日の記事
S3で誤ったデータの公開を防ぐパブリックアクセス設定機能が追加されました | DevelopersIO
https://dev.classmethod.jp/cloud/aws/s3-block-public-access/