フリマの写真は1回の要求
フリマアプリで、出品する品物の写真をアップロードします。写真は、クラウドの S3 バケットに保存されます。バケットとは、ファイルを入れる、名前のついた入れ物です。
プログラムは、保存先のコンピューターにログインしません。ウェブで要求を送り、答えを読みます。このレッスンでは、クラウドのサービスとは何か、どこで動くか、だれが何を守るかを学びます。
このレッスンのゴール
メモ
リージョン、サービス、API 呼び出しが何かを説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| サービス | ウェブ越しに使う、できあいの道具 | |
| API 呼び出し | サービスへの1回の要求と、その答え | |
| リージョン | サービスが動いている、世界の地域 | ap-northeast-1 |
| バケット | S3 で、ファイルを入れる名前つきの入れ物 | |
| 責任共有モデル | 提供者と利用者が、それぞれ守る範囲を持つこと |
学生が入力するセルは、このプレビューでは空白です。
このモジュールがしないこと
メモ
AWS のアカウントは要りません。何もデプロイしません。本物の鍵、パスワード、アカウント番号は、決して入力しません。費用や請求の学習でもありません。本物と同じ形の答えを、オフラインで読み、それを扱う Python を書きます。
サービスは呼び出す API
クラウドの会社は、大きなコンピューターを持ち、その働きを貸し出します。貸し出される道具がサービスです。S3 はファイルを保存し、SQS はメッセージの列を保ち、DynamoDB は表にデータを入れます。
API 呼び出しは、サービスの使い方です。list_objects_v2 のような呼び出しの名前と、必要な情報を送ります。答えはデータで返ります。
実行: 呼び出しと答え
call = {"service": "s3", "operation": "list_objects_v2", "Bucket": "flea-photos"}
answer = {
"Name": "flea-photos",
"KeyCount": 2,
"IsTruncated": False,
"Contents": [
{"Key": "items/kettle.png", "Size": 2048, "StorageClass": "STANDARD"},
{"Key": "items/toaster.png", "Size": 3072, "StorageClass": "STANDARD"},
],
}
print("サービス:", call["service"])
print("呼び出し:", call["operation"])
print("キーの数:", answer["KeyCount"])
for item in answer["Contents"]:
print(item["Key"], item["Size"])
# toaster の Size を 5000 に変えて、もう一度実行しましょう。
失敗した呼び出しも答え
呼び出しは、いつも成功するとは限りません。キーがなかったり、バケットがなかったりします。そのときサービスは、問題を表す Code と、HTTP の状態を、エラーとして返します。
コードは、まずエラーを調べます。"Contents" in answer は、成功したときにしか使えません。
実行: 成功とエラーの見分け
good = {"KeyCount": 1, "Contents": [{"Key": "readme.txt", "Size": 5}]}
bad = {"error": {"Code": "NoSuchBucket", "HTTPStatusCode": 404}}
for answer in [good, bad]:
if "error" in answer:
print("失敗:", answer["error"]["Code"], answer["error"]["HTTPStatusCode"])
else:
print("成功、キーの数:", answer["KeyCount"])
# "NoSuchBucket" を "NoSuchKey" に変えて、もう一度実行しましょう。
よくある間違い
注意
答えが空なら、エラーだと考える人が多いです。そうではありません。DynamoDB に、ない項目を求めると、{} と正常な状態が返ります。error の項目と Code を探し、空の答えは「何も見つからなかった」と考えましょう。
リージョンはサービスの場所
クラウドの会社は、世界中にデータセンターを持っています。リージョンは、その一つの地域です。たとえば ap-northeast-1 は東京で、eu-west-2 はロンドンです。
リージョンはバケットを作るときに選び、ファイルはそこに置かれます。利用者に近いリージョンを選ぶと、答えが速く届きます。
実行: バケットのリージョン
answer = {
"Buckets": [
{"Name": "flea-photos", "BucketRegion": "ap-northeast-1", "BucketArn": "arn:aws:s3:::flea-photos"},
{"Name": "flea-backups", "BucketRegion": "us-east-1", "BucketArn": "arn:aws:s3:::flea-backups"},
],
"Owner": {"DisplayName": "flea", "ID": "owner-id"},
}
for bucket in answer["Buckets"]:
print(bucket["Name"], "のリージョンは", bucket["BucketRegion"])
# ap-northeast-1 のバケットだけ表示しましょう。ループの中に if を足します。
提供者と利用者で分担する
提供者は、建物、機械、サービスのソフトを守ります。利用者は、入れるデータと、使える人を守ります。
これが責任共有モデルです。バケットをだれでも読める設定にしたのは、利用者の選択です。データセンターが停電したときは、提供者が対応します。
だれが何を守るか
| もの | 守る人 |
|---|---|
| 建物と電気 | 提供者 |
| S3 のソフトそのもの | 提供者 |
| どのファイルを上げるか | 利用者 |
| だれがバケットを読めるか | 利用者 |
| サービスを呼び出すコード | 利用者 |
学生が入力するセルは、このプレビューでは空白です。