S3こんにちは、AWS担当のwakです。AWSソリューションアーキテクトのプロフェッショナルを取らないといけなくなったので、S3について勉強がてらまとめました。durability)を売りにしています。S3に1万個のオブジェクトを保存したとき、1000万年に1個消える可能性があるということです。Zone、物理的に離れたデータセンター)にレプリケーションされます。Zone-IAとRRSは例外です。(CRR)バケット単位で指定可能な設定で、S3に保存したオブジェクトを自動的に別のリージョンのバケットへレプリケーションしてくれます。別アカウントのバケットにレプリケーションすることも可能です。バージョニング(後述。上書き・削除しても過去の履歴が全て残る機能)を有効にしておく必要があります。(ドキュメント)一部の暗号化されたオブジェクト、バージョンIDを指定した削除リクエストはレプリケーションされません*1。Zone-IAが利用できます。ストレージクラスオブジェクトを保存する種別のことで、オブジェクトごとに個別に指定できます。(標準)デフォルトで使われるストレージクラスです。料金は$0.025/GB(最初の50TBまで)となっています。(標準・低頻度アクセス)滅多に使わないオブジェクトはSTANDARD_IAとして保存すると料金が安くなります。Accessの略で低頻度アクセスを意味します。堅牢さはSTANDARDと同等で、料金は$0.019/GBと24%も安くなりますが、30日以内に削除すると30日分の料金がかかる、取り出しに転送料とは別の料金がかかる等、料金体系が異なります。アップロード時にSTANDARD_IAを指定することもできますし、ライフサイクルポリシーも利用できます(後述)。(1ゾーン・低頻度アクセス)ドキュメントではONEZONE_IAとも表記されています。Zone-IAではレプリケーションが行われません。災害や障害で運悪くオブジェクトを保存しているAZが壊れるとオブジェクトが消えます。料金はSTANDARD_IAよりもさらに安く、$0.0152/GBとなります。Zone-IAを指定することもできますし、ライフサイクルポリシーも利用できます(後述)。Storageの略で、2つのAZにしかレプリケーションされない代わりに料金が安くなります。この記事を書いている時点で料金表からも消えており、ドキュメントには利用が推奨されていないと明記してあるのでそのうち使えなくなるかもしれません。(ドキュメント)GLACIERアーカイブ用のストレージクラスです。データを直接GLACIERにアップロードすることはできません*3。一度他のストレージクラスでデータをS3に保存し、ライフサイクルポリシーでGLACIERへ移動することになります。直接データを取り出すこともできず、事前に復元作業を行う必要があります。料金は$0.005/GBと極めて安価ですが、他に取り出し料がかかります。Zone-IA/GLACIERのいずれかに移動するか、または削除するというルールが設定できます。途中でマルチパートアップロードが止まって残っているゴミ(後述)を自動削除することもできます。HTTPを通じたアップロードサイズ制約1回のPUTでアップロード可能なサイズは5GBです。マルチパートアップロードを使うと5TBになります。(ドキュメント)マルチパートアップロード大きなサイズのオブジェクトをアップロードする際、最大1万個にオブジェクトを分割して転送することができます。並行してアップロードすることもできるので時間の節約になり、リトライもやりやすくなります。アップロードが終わったら(または中断したら)その旨を通知して削除しないとアップロードは完了せず、転送済みのゴミがS3に残って無駄な課金が発生します。ヘッダでオブジェクトのMD5を付加することができます。このヘッダがある場合、AWSはアップロード完了時に受け取ったデータのMD5を算出し、両者が一致しなかったらエラーを返してくれます。コマンドでは自動的に行われます。(ドキュメント)*4また、マルチパートアップロードが行われなかった場合はMD5の値がETagタグにセットされるので、こちらをチェックすることでも確認ができます。書き込み・上書き更新・削除を行い、その直後に読み取りをすると、それらの操作の前の状態が取得できてしまうことがあります。同じキーで同時にアップロードを行うとタイムスタンプが遅い方が勝ちます。これはどうしようもありません。Accelerationバケット単位での設定で、追加料金がかかる代わりにデータ転送が速くなるエンドポイントが利用できます。通常のエンドポイントと変わらないと判断された場合は追加料金がかからないというサービスがあります。このエンドポイントでもマルチパートアップロードは利用可能です。URL」を発行することができます。PUTでデータを送信すると、認証なしでオブジェクトをアップロード(または上書きアップロード)することができます。ダウンロード用の署名付きURLを作成することもできます(後述)。Connectを通じてVPCエンドポイントを経由しS3を利用するような構成も可能です。この場合、データはインターネットを通りません。HTTP以外のアップロード&ダウンロードSnowballAWS謹製のストレージデバイス(1個最大80GB)をAWSのデータセンターと直接やり取りする方法です。デバイスが届いたらネットワーク接続(10Gbpsに対応)してデータを転送します。S3へのデータのインポートとエクスポートに利用できます。受け取りからデータ転送完了まではだいたい1週間程度です。EdgeSnowballの強いやつです。容量は100GBで、ただのストレージデバイスではなくLambdaを実行することもできます(インターネット接続は不要です)。クラスタを組んで容量・処理速度を増大させることができます。Snowballと同様データのインポートとエクスポートに利用できます。かかる時間はSnowballと同じぐらいです。SnowmobileAWSの巨大なトレーラー(長さ14m)が直接ユーザーのところにやってきます。データを吸い出したらトレーラーはAWSのデータセンターに戻り、S3またはGLACIERにデータを転送します。100PBまでのデータのインポートに利用できます。必要な時間は数週間になります。GatewayオンプレミスのサーバーとS3を接続し、サーバーに配置したファイルを裏でS3と同期するサービスです(転送は非同期で行われます)。利用できなくなりました。USBメモリ、eSATAのHDDなどをAWSのデータセンターと直接やり取りするものでした。URL」を発行することができます(アップロードについては前述)。プライベートなオブジェクトに認証なしでアクセスできるようになるので、一時的に(有効期限を付けて)ファイルを公開してダウンロードさせるために利用することができます。CloudFrontとの連携S3のオブジェクトを直接Webに公開するのではなく、CloudFront経由で配信することができます。IDプロバイダー)のIDとIAMロールとをマッピングすることができます。ユーザーに一時的なAWS証明書を与え、一般には非公開としているS3のオブジェクトにアクセスさせたり、DynamoDB*5の読み書きをさせたりできます。GoogleなどのアカウントとIAMロールをマッピングするものです。Cognitoを使うと楽です。(ドキュメント)実際にCognitoでGoogleアカウントとロールをマッピングする関連記事も書きました。2.0に対応したIdPをAWSに登録し、それらのアカウントとIAMロールとをマッピングするものです。(ドキュメント)バージョニングバケットのバージョニングを有効に設定すると、上書き・削除してもオブジェクトの過去の履歴が全て残るようにできます。バケットのバージョニングは一度有効にしたら無効にはできず、停止のみが可能です。Deleteを有効にすると、バケットのバージョニング状態を変更する・オブジェクトを完全に削除する際にMFAが必要になります。パフォーマンスS3のオブジェクトはキー(=ただの文字列)で識別されるため、大量のオブジェクトに同じようなキー(たとえば連番、日付など)が振られていると、S3のオブジェクト検索速度が落ちることがあります。大量のアクセスを受け付けてこれが問題になる場合、適当な工夫をしてキーを分散させてやる必要があります。逆に管理は面倒になるため、場合によってはDynamoDBや自前のDBでオブジェクトを別途管理する必要があるかもしれません。Encryption)には3つのオプションがあります。いずれにしてもメタデータは暗号化されず、オブジェクト一覧取得リクエストからオブジェクトの存在を隠すこともできません。値はオブジェクトのMD5ではなくなります。(SSE-S3)S3側で暗号化キーを勝手に用意してくれます。アップロード時に自動的に暗号化が、ダウンロード時に自動的に復号が行われます。公開した場合、オブジェクトはそのまま外部からアクセス可能になります。Service)で管理されたキーを使って暗号化が行われます。ダウンロード時にも同じくKMSで管理されたキーで復号が行われてから転送されます。したがってアップロード時・ダウンロード時ともにKMSのキーへのアクセス権限が必要になります。公開しても部外者はデータを取得できません。(SSE-C)アップロード時、HTTPヘッダに暗号化キーを指定すると、S3にそのキーで暗号化されたオブジェクトが格納されます。ダウンロード時にも同様に同じキーを指定する必要があります。公開しても部外者はデータを取得できません。キーを失うとオブジェクトにアクセスできなくなるということになります。(ドキュメント)クライアントサイド暗号化S3にアップロードする前にクライアント側で暗号化します。KMSを使うことも、独自のマスターキーを使うこともできます。いずれにしても、1個のマスターキーのみで全てのオブジェクト(ファイル)を暗号化するのではなく、オブジェクトごとに異なる鍵で暗号化を行い、その鍵をマスターキーで暗号化してオブジェクトと一緒に保存しておくという流れになります。ID)だけで事を済ませることができます。IDを送り、ランダムに生成される1回限り使い捨ての鍵(AES)を取得します。上の鍵そのものが暗号化されたもの。KMSでしか復号できないのセットです。この(A)でオブジェクト(X)を暗号化し、(A)を削除し(もう不要なので)、暗号化されたオブジェクト(X')と(B)とをセットでS3にアップロードします。復号時にはこのセットをダウンロードし、KMSに(B)の復号を依頼します。権限があれば復号が成功して(A)が入手できるので、暗号化されたオブジェクトを復号することができます。IDの利用権限がなければKMSにアクセスできず、(A)が得られないため、オブジェクトは守られます。SDKはKMSを使わないクライアントサイド暗号化にも対応しています。keyを暗号化し、その両者をS3にアップロードします。復号時はこの逆の操作を行います。マスターキーはいかなる形でもAWSに送信されません。イベント通知S3のオブジェクトが更新・削除された際、その通知を送ることができます。通知先はSNS、SQS、Lambdaが指定できます。キーに対してプレフィックス・サフィックスで絞り込みを行うこともできます。画像ファイルがアップロードされたとき、自動的にLambdaを起動してそのサムネイル画像を生成するなどの使い方が考えられます。GZIP圧縮ファイルにも対応)に対して、直接SQLを発行することができます。(ドキュメント)まとめざっくりS3の機能についてまとめました。S3はAWSの様々なサービスを仲介するハブの役割を果たす重要な存在であり、AWSソリューションアーキテクトを取るのであればその仕組みを正しく知っておく必要があります。*1:これは悪意のある削除から守るためです。バージョンIDを指定しない削除リクエストはレプリケーションされます(つまりレプリケーション先でも削除されます)が、通常、バージョニングが有効になったバケットでオブジェクトを丸ごと削除するには別の権限が必要です*2:2018/6/20現在、東京リージョンの料金。データ転送料、リクエストごとにかかる料金は別。以下同様です*3:引っかけ問題を何度か見ました。put-objectで低レベルAPIを呼び出せ」という古い記述が残っていますが、これは不要です。Chromeアプリ[Postman]の使い方メモ井上です。API作成時にとても便利なPostman。LambdaでWebサイトの死活監視を行ってSlackに結果を流すこんにちは、AWS担当のwakです。Lambdaの話をし...2015-08-31OpenSSLコマンドでオレオレ証明書を作り、ルート認証局としてサーバー証明書を発行するこんにちは、最近あまりWebの話をしていないwakです。使いこなしたい!こんにちは、最近忙しい、和朗です。(1)はてなブログをはじめよう!jabe20さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。