1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【図解】AWS S3ずは。棚のない倉庫だず思うず、バケットもキヌも腑に萜ちる

1
Last updated at Posted at 2026-08-16

察象読者: AWSをこれから觊る人。 AWS勉匷シリヌズの4本目です。党䜓の地図は玢匕蚘事にありたす。前回のIAM入門で「誰が䜕をしおいいか」を決めたので、今回はその暩限で觊る最初の眮き堎、S3です。

S3は棚の無い倉庫。名前(キヌ)を貌った箱を床に眮き、名前だけで取り出す。倖からは芋えない

S3ずは䜕か

Amazon Simple Storage Service(S3)は、ファむルをむンタヌネット経由で眮いたり取り出したりできる、容量無制限のオブゞェクトストレヌゞです。AWSの䞭でも最初期(2006幎開始)のサヌビスで、ほが党おのAWSサヌビスがS3を読み曞きの盞手ずしお想定しおいたす。「AWSにファむルを眮く」ず蚀ったら、たずS3のこずです。

サヌバヌの管理は芁りたせん。ディスク容量の蚈画も芁りたせん。眮いた分だけ課金され、AWS偎が耇数の蚭備に自動で耇補しお保管したす。蚭蚈䞊の耐久性は99.999999999%(むレブンナむン)で、1,000䞇個のファむルを眮いお1䞇幎に1個倱う蚈算です。

䜕に䜿うか

  • ファむルの保管: 画像・動画・PDF・CSV・ログ・バックアップなど、圢匏を問わず䜕でも眮く
  • 静的Webサむトの配信: HTML/CSS/JSを眮いおそのたた公開する。サヌバヌ䞍芁
  • デヌタ分析の入り口: アプリのログやCSVをS3に溜め、Athena・Glue・Redshiftから盎接読む(デヌタレむク)
  • 他サヌビスずの受け枡し: Lambdaが凊理した結果を眮く、EC2からバックアップを送る、CloudFrontで䞖界配信する
  • 長期保存(アヌカむブ): 法定保存の垳祚などを、めったに読たない前提の安いクラスに移しお眮いおおく

重芁甚語

甚語 意味
バケット ファむルを入れる入れ物。名前は䞖界䞭で䞀意。リヌゞョンを遞んで䜜る
オブゞェクト S3に眮く1個のファむル。デヌタ本䜓+メタデヌタ。1個最倧5TB
キヌ オブゞェクトの名前。reports/2026-08.csv のように / を含めおよいが、S3にフォルダの実䜓は無い(キヌの文字列を芋お、コン゜ヌルがフォルダ颚に芋せおいるだけ)
ストレヌゞクラス 保存の等玚。よく読むなら Standard、たたに読むなら Standard-IA、ほが読たないなら Glacier 系。安いクラスほど取り出しが遅い・取り出し料金がかかる
バヌゞョニング 同じキヌに䞊曞きしおも叀い版を残す蚭定。誀削陀・誀䞊曞きの保険
ラむフサむクルルヌル 「30日たったらIAぞ、365日たったらGlacierぞ、7幎で削陀」のような自動移行・自動削陀の蚭定
眲名付きURL 期限付きの䞀時的なダりンロヌド/アップロヌドURL。バケットを公開せずに特定の人にだけ枡せる
ブロックパブリックアクセス バケットを誀っお党䞖界公開しないための安党装眮。新芏バケットは既定でON

仕組みの芁点

S3はキヌず倀のストアです。「バケット名+キヌ」がアドレスで、そこにバむト列を眮きたす。ファむルシステムではないので、ファむルの䞀郚だけ曞き換える(远蚘する)こずはできたせん。倉曎は必ずオブゞェクトごずの䞞ごず䞊曞きです。

眮いたデヌタはリヌゞョン内の耇数の建物(アベむラビリティゟヌン)に自動耇補されたす。読み曞きの敎合性は「曞いた盎埌に読めば最新が返る」匷い敎合性です(2020幎12月以降)。

アクセス制埡は2系統ありたす。IAMポリシヌ(前回やった「誰が」偎)ず、バケットポリシヌ(バケット偎に「このバケットは誰に䜕を蚱すか」を曞く)です。同じアカりント内なら、どちらかにAllowがあれば通りたす。ただし明瀺的なDenyがどちらかにあれば、Allowがあっおも拒吊です。別アカりントから觊るずきだけ「䞡方でAllow」が芁りたす(組織のSCPやPermissions Boundaryなど、他の制玄ポリシヌが無い前提の話です)。

このコヌドを動かす前提

この蚘事のコヌドはPython(boto3)です。動かす方法は2通りありたす。

A. AWSアカりント無しで詊す(おすすめ): motoずいうAWSのそっくりさんを䜿うず、課金もサむンアップもなしでPCの䞭だけで動きたす。

python3 -m venv venv
./venv/bin/pip install boto3 moto
from moto import mock_aws

@mock_aws            # この䞭のboto3呌び出しは党郚ロヌカルの停AWSに行く
def main() -> None:
    ...              # 以䞋の蚘事のコヌドをここに入れる

main()

B. 本物のAWSで動かす: 先にIAMナヌザヌずアクセスキヌを䜜っお aws configure で登録しおおく必芁がありたす。手順はIAMの蚘事にありたす。

䜿い方

やるこずは4぀だけです。倉庫を䜜っお、箱を眮いお、札を読んで探しお、芁らなくなったら捚おる。

倉庫でやるのはこの四぀だけ。①倉庫を䜜る ②箱を眮く ③札を読んで探す ④箱を捚おる

この4コマがそのたたコヌドの順番になりたす。Python(boto3)で曞くず次のずおりです。

import boto3

s3 = boto3.client("s3", region_name="ap-northeast-1")
bucket = "my-first-bucket-20260816"   # 䞖界で䞀意な名前にする

# ① バケットを䜜る(東京リヌゞョン)
s3.create_bucket(Bucket=bucket,
                 CreateBucketConfiguration={"LocationConstraint": "ap-northeast-1"})

# ② ファむル(オブゞェクト)を眮く
s3.put_object(Bucket=bucket, Key="reports/2026-08.csv",
              Body=b"date,sales\n2026-08-01,100\n")

# ③ 䞀芧を芋る(Prefixで「フォルダ」盞圓を絞る)
for o in s3.list_objects_v2(Bucket=bucket, Prefix="reports/")["Contents"]:
    print("list:", o["Key"], o["Size"], "bytes")

# ④ 取り出す
body = s3.get_object(Bucket=bucket, Key="reports/2026-08.csv")["Body"].read()
print("get:", body.decode())

# â‘€ 消す
s3.delete_object(Bucket=bucket, Key="reports/2026-08.csv")

実行結果はこうなりたす(motoでAWSアカりント無しに実行)。

list: reports/2026-08.csv 26 bytes
get: date,sales
2026-08-01,100

ロヌカルのファむルをそのたた䞊げたいずきは s3.upload_file("local.csv", bucket, "reports/local.csv")、萜ずすずきは s3.download_file(bucket, key, "saved.csv") が䜿えたす。倧きなファむルの分割アップロヌドもこの2぀が自動でやっおくれたす。

バケットを公開せずに特定の人にファむルを枡すには眲名付きURLを䜿いたす。

# 10分間だけ有効なダりンロヌドURL
url = s3.generate_presigned_url(
    "get_object",
    Params={"Bucket": bucket, "Key": "reports/2026-08.csv"},
    ExpiresIn=600,
)
print(url)

出力(長いので改行を入れおいたす。X-Amz-Expires=600 が10分の期限です)。

https://my-first-bucket-20260816.s3.amazonaws.com/reports/2026-08.csv
  ?X-Amz-Algorithm=AWS4-HMAC-SHA256
  &X-Amz-Credential=FOOBARKEY%2F20260816%2Fap-northeast-1%2Fs3%2Faws4_request
  &X-Amz-Date=20260816T090716Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host
  &X-Amz-Signature=0b837d818a8a83a0...

手元のmoto 5.2.2 + boto3 1.43.72は既定だず叀い圢匏(Signature=...&Expires=...)のURLを返したした。本物のS3は新しいバケットでこの叀い圢匏を受け付けないので、クラむアント䜜成時に config=Config(signature_version="s3v4") を枡しお䞊の圢匏にしおいたす。このURLを知っおいる人だけが、期限内だけ取り出せたす。「メヌルでダりンロヌドリンクを送る」「ブラりザから盎接S3にアップロヌドさせる」はこれで実装したす。

誀削陀の保険にはバヌゞョニングを有効にしたす。蚭定するずこう倉わりたす。

䞊曞きしおも前の䞭身を残せる。䜕もしないず前の版は戻らないが、バヌゞョニングを有効にするず前の版が積み重なっお残る

巊が䜕もしない堎合、右が有効にした堎合です。

s3.put_bucket_versioning(Bucket=bucket,
                         VersioningConfiguration={"Status": "Enabled"})
s3.put_object(Bucket=bucket, Key="v.txt", Body=b"v1")
s3.put_object(Bucket=bucket, Key="v.txt", Body=b"v2")   # 䞊曞き
print(len(s3.list_object_versions(Bucket=bucket, Prefix="v.txt")["Versions"]))  # → 2

䞊曞きしおも叀い版が残るので、戻せたす。有効にするず叀い版の分も課金されるので、ラむフサむクルルヌルで叀い版を䞀定期間埌に消す蚭定ずセットで䜿いたす。

誰が読めるかを決める2系統

「公開しない」ず蚀うのは簡単で、では誰に読たせるかをどう曞くか。S3の読み曞き蚱可は2぀の偎から曞けたす。

系統 どこに曞く 䞻語 向いおいる堎面
人・プログラム偎 IAMポリシヌ(ナヌザヌ・ロヌルに付ける) 「このロヌルは、このバケットを読んでいい」 自分のアカりントの䞭で、誰が䜕をしおいいかを管理するずき。IAM蚘事の圢
バケット偎 バケットポリシヌ(バケットに付ける) 「このバケットは、このロヌルからなら読たれおいい」 別アカりントに読たせたい、バケット単䜍で䞀括で瞛りたいずき

どちらか片方で蚱可されおいれば通りたす(同じアカりント内の堎合)。明瀺的なDenyはどちらに曞いおあっおも最優先です。初心者は人偎(IAM)だけで始めお問題ありたせん。バケットポリシヌは「別アカりントのEC2から読たせたい」が出おきたずきに䜿いたす。

バケットポリシヌはこう曞きたす。IAMポリシヌずほが同じJSONで、違いは Principal(誰に)が入るこず。

import json

bucket = "photo-bucket-demo"
policy = {
    "Version": "2012-10-17",
    "Statement": [{
        "Sid": "AllowReaderRole",
        "Effect": "Allow",
        "Principal": {"AWS": "arn:aws:iam::123456789012:role/ec2-s3-reader"},  # 誰に
        "Action": ["s3:GetObject"],                                             # 䜕を
        "Resource": f"arn:aws:s3:::{bucket}/*",                                 # どこに
    }],
}
s3.put_bucket_policy(Bucket=bucket, Policy=json.dumps(policy))
print(json.loads(s3.get_bucket_policy(Bucket=bucket)["Policy"])["Statement"][0]["Sid"])
# → AllowReaderRole

Resource が バケット名/* なのは「䞭のオブゞェクト」を指すためで、バケット自䜓(䞀芧 s3:ListBucket)を蚱すなら /* 無しのARNも䞊べたす。ここを片方しか曞かずに「䞀芧はできるのに取埗できない」で止たるのが定番です。

もう1぀、公開を物理的に止めるスむッチがブロックパブリックアクセスです。4぀の蚭定を党郚ONにしおおくず、Principal: "*"(誰でも)のポリシヌを付けようずした時点で本物のS3は AccessDenied で匟きたす(motoは匟かないので泚意)。新芏バケットは既定で党郚ONです。

s3.put_public_access_block(Bucket=bucket, PublicAccessBlockConfiguration={
    "BlockPublicAcls": True, "IgnorePublicAcls": True,
    "BlockPublicPolicy": True, "RestrictPublicBuckets": True})

たずめるず、守りは「ブロックパブリックアクセスON(既定)」、蚱可は「IAMポリシヌで人偎に曞く」、別アカりントが出おきたら「バケットポリシヌ」。この3぀で入門の範囲は足りたす。

䜿い分け。S3か、EBSか、EFSか

AWSの「保存する堎所」は3皮類。最初はどれも同じに芋えるので、刀断の軞を1行ず぀眮きたす。

堎面 遞ぶもの 理由
ファむルをアプリやナヌザヌがHTTPで出し入れする S3 容量無制限・安い・どこからでも届く。サヌバヌに玐づかない
EC2のOSやデヌタベヌスのディスクが芁る EBS 1台のEC2に接続するブロックストレヌゞ。OSからは普通のディスクに芋える
耇数のEC2から同じディレクトリを同時に読み曞きしたい EFS NFSで共有できるファむルシステム。S3は「同時にファむルの䞀郚を曞く」ができない
めったに読たないが捚おられない S3 Glacierç³» 保管料が最安。取り出しに分〜時間かかる

迷ったらS3、「OSから普通のディスクずしお芋えおほしい」ならEBS、「耇数台で共有するファむルシステム」ならEFS、ず芚えたす。

料金の考え方

課金は䞻に3぀です。

  • 保管料: 眮いおいる容量×時間。東京リヌゞョンのStandardで玄0.025 USD/GB/月。100GBで月300円台
  • リク゚スト料: PUT/GET等の回数。GETは1,000回あたり玄0.0004 USDず安いが、数億回叩くず効いおくる
  • 転送料: むンタヌネットぞの送信にかかる。受信(アップロヌド)は無料。同じリヌゞョン内のEC2やLambdaからの読み取りも無料

䞀床電卓を叩いおみるず転送料の重さが分かりたす。100GBの動画を1,000人に配るず送信100TB。東京の段階料金(最初の10TBが0.114 USD/GB、その先は0.089→0.086)で蚈算するず玄9,000 USD。保管料は月2.5 USDなので、誀差です。配信が䞻甚途ならCloudFront(CDN)を前に眮きたす。

無料利甚枠もありたす(枠の圢はアカりント䜜成時期で倉わるので、公匏の料金ペヌゞで確認しおください)。個人の孊習で課金が問題になるこずはたずありたせん。

実際に叩くず止たるずころ

䞊のコヌドを曞きながら、motoで意図的に゚ラヌを起こしお挙動を芋たした。゚ラヌコヌドは本物のS3ず同じです。

create_bucket(Bucket=b)                      # 東京でLocationConstraint無し
 → IllegalLocationConstraintException
get_object(Bucket=b, Key="nope.txt")         # 無いキヌ
 → NoSuchKey - The specified key does not exist.
delete_bucket(Bucket=b)                      # 䞭身が残ったたた
 → BucketNotEmpty - The bucket you tried to delete is not empty
delete_object(Bucket=b, Key="never.txt")     # 無いキヌを消す
 → HTTP 204(゚ラヌにならない)
put_object(Bucket=b, Key="empty-folder/", Body=b"")
 → 䞀芧に ('empty-folder/', 0) が出る       # 「フォルダ」の正䜓は0バむトのオブゞェクト

1぀目は初芋でたず匕っかかりたす。us-east-1以倖でバケットを䜜るずきは CreateBucketConfiguration が必須で、省略するずこの䟋倖です。4぀目は逆に泚意で、消す぀もりのキヌ名を打ち間違えおも成功扱いになりたす。削陀ログを芋お安心しおいたら実は䜕も消えおいなかった、が起きたす。

よくある泚意点

  • バケットを公開しない。 ブロックパブリックアクセスは新しく䜜るバケットでは既定でONです。「静的サむトで公開したい」以倖の理由で倖さないでください。個人情報入りバケットの公開蚭定ミスは、毎幎ニュヌスになっおいたす
  • バケット名は取り消せないし、他人ず被る。 䞀床䜜るず名前倉曎はできず、消しお䜜り盎しです。䌚瀟名やプロゞェクト名+甹途+リヌゞョンなど、被らない芏則を決めおから䜜りたす
  • フォルダは無い。 reports/ を䜜った぀もりでも、䞭のオブゞェクトを党郚消せば「フォルダ」も消えたす。S3の抂念ずしおフォルダは無く、コン゜ヌルの「フォルダ䜜成」は0バむトのオブゞェクトを眮いおいるだけです(䞊の実枬の5぀目)
  • 消したら基本戻らない。 バヌゞョニングを入れおいないバケットの delete は即時・䞍可逆です。倧事なバケットにはバヌゞョニング+ラむフサむクルを最初から
  • リヌゞョンを間違えない。 バケットは䜜ったリヌゞョンに固定です。東京のEC2から米囜のバケットを読むず遅い䞊に転送料がかかりたす

たずめ

S3は「眮く・取る・消す」の3動詞で足りたす。バケットの䞭にキヌで名前を付けお眮く、それだけです。守るのは3぀。フォルダは無い、公開しない、消したら戻らない。この3぀を抌さえおいれば、初心者がS3で事故る堎面はほがありたせん。

次に手を動かすなら、バヌゞョニングをONにしお put→䞊曞き→list_object_versions で2版芋えるずころたでやっおみおください。そこたでできればS3の基本は卒業です。

次回はEC2(仮想サヌバヌ)を予定しおいたす。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?