写真をアップロードすると、どこへ行く?
写真アプリは、あなたの画像を1台のスマホに置いたままにはしません。クラウドの保存サービスに送り、別のプログラムが小さくできるようにキューにメモを置き、テーブルに記録します。この3つの仕事を担うのが S3、SQS、DynamoDB です。
このレッスンが終わると
メモ
練習用のクラウドで、AWS のコマンドラインを使ってデータを保存し、キューに入れ、探すことができます。
キーワード
- バケット:S3 でファイルを入れる、名前のついた入れ物。
- オブジェクト:保存された1つのファイル。キーで見つける。
- キュー:順番に処理されるのを待つメッセージ。
- テーブル:DynamoDB で、キーのもとに置かれた項目。
- エミュレーター:サービスのようにふるまうが、本物ではない複製。
はじめに:もう知っていること
メモ
頭の中で答えましょう。1. ファイル名は何のためにありますか。2. バス停の行列は何のためにありますか。3. データベースのテーブルの1行は何ですか。答え: ファイルを見つけるための名前。人を順番に呼ぶため。1件の記録です。
始める前に
メモ
レッスンの上のバーにある ラボを起動 を押し、動いていると表示されるまで待ちます。スタックは cloud というサービスで、ターミナルはその名前でつながります。ここで有効なのは S3、SQS、DynamoDB だけです。ほかのサービス、たとえば Lambda をたずねると、エラーが返ります。作ったものは、ラボを停止して起動しなおしても残ります。下の 実行 ボタンは、それぞれのコマンドをラボのターミナルに、同じセッションの中で順番に入力します。様子を見たいときや自分で入力したいときは、バーの ターミナルを開く(新しいタブ) を押します。
1. バケットはオブジェクトを入れる
1つ目のコマンドは、aws コマンドに、スタックが確かめないので作り物のキー、リージョン us-east-1、自分専用のスタックのアドレスを渡し、何も表示しません。mb はバケットを作り、make_bucket: lab-bucket と表示します。次のコマンドは、テキスト hello cloud をキー hello.txt でバケットに送り、何も表示しません。- にコピーすると、オブジェクトが表示されます。hello cloud です。最後は、一度も保存していないキーをたずねます。返事は NoSuchKey と The specified key does not exist. というエラーで、本物の AWS でも同じです。
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1 AWS_ENDPOINT_URL=http://cloud:4566ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws s3 mb s3://lab-bucketここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
echo "hello cloud" | aws s3 cp - s3://lab-bucket/hello.txtここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws s3 cp s3://lab-bucket/hello.txt -ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws s3api get-object --bucket lab-bucket --key nothing.txt /dev/nullここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2. キューは削除するまでメッセージを持つ
1つ目のコマンドはキューを作り、そのアドレスを Q に入れておくので、自分で入力しなくて済みます。2つ目はメッセージを送り、MD5OfBody と MessageId を表示します。3つ目はそれを受け取り、Messages の下に Body、つまり first message とともに表示し、返事を reply.json に保存します。4つ目は、受け取った証拠である ReceiptHandle を切り出して H に入れます。delete-message は何も表示しません。受け取るとメッセージがキューから消えると思う人が多くいますが、そうではありません。しばらく隠れるだけで、削除しないと戻ってきて2回処理されます。
Q=$(aws sqs create-queue --queue-name lab-queue --query QueueUrl --output text)ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws sqs send-message --queue-url $Q --message-body "first message"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws sqs receive-message --queue-url $Q | tee reply.jsonここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
H=$(grep -o '"ReceiptHandle": "[^"]*"' reply.json | cut -d'"' -f4)ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws sqs delete-message --queue-url $Q --receipt-handle "$H"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
3. テーブルはキーのもとに項目を置く
1つ目のコマンドは、author と title をキーにしたテーブル Books を作り、"ACTIVE" と表示します。2つ目は項目を2つ、1回の要求で保存し、空の UnprocessedItems を表示します。get-item は完全なキーで項目を1つたずね、それを表示します。値はそれぞれ型に包まれていて、S は文字、N は数です。query は1人の著者の項目をすべて読み、Count が 2 で、2つのタイトルを表示します。保存していないキーを get-item でたずねると、何も表示されません。ここでは、ない項目はエラーではなく空の返事です。
aws dynamodb create-table --table-name Books --attribute-definitions AttributeName=author,AttributeType=S AttributeName=title,AttributeType=S --key-schema AttributeName=author,KeyType=HASH AttributeName=title,KeyType=RANGE --billing-mode PAY_PER_REQUEST --query TableDescription.TableStatusここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws dynamodb batch-write-item --request-items '{"Books":[{"PutRequest":{"Item":{"author":{"S":"Ada"},"title":{"S":"Notes"},"year":{"N":"1843"}}}},{"PutRequest":{"Item":{"author":{"S":"Ada"},"title":{"S":"Sketch"},"year":{"N":"1842"}}}}]}'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws dynamodb get-item --table-name Books --key '{"author":{"S":"Ada"},"title":{"S":"Notes"}}'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
aws dynamodb query --table-name Books --key-condition-expression "author = :a" --expression-attribute-values '{":a":{"S":"Ada"}}' --query '{Count:Count,Titles:Items[].title.S}'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
最後の確認
ヒント
前に戻らずに答えましょう。1. バケットの中でオブジェクトを見つけるものは何ですか。2. ないキーに対して S3 が返すエラーは何ですか。3. 処理し終えたメッセージには何をしますか。4. このスタックは本物の AWS ですか。答え: そのキーです。NoSuchKey です。削除します。いいえ、エミュレーター、つまり練習用の複製です。
先生へ
ヒント
このレッスンは、ラボの中で進めるレッスンの小さな見本です。手順と実行ボタンがレッスンで、ラボは生徒ひとりひとりのコピーです。ラボは小さなサービスがひとつと、名前つきボリュームがひとつで、自動採点はありません。生徒は自分のセッションの返事、つまりオブジェクトを送って一覧して読んだバケット、メッセージを送って受け取って削除したキュー、項目を保存して読んで問い合わせたテーブル、ないキーのエラーを提出し、MiniStack が何ではないかを一文で書きます。要点:1. S3 はバケットの中にキーでオブジェクトを保存する。2. キューはメッセージを持ち、メッセージは削除で終わる。3. DynamoDB はキーのもとに項目を保存し、クエリはキーの一部のもとにある項目をすべて読む。4. ない S3 のキーはエラーで、ない DynamoDB の項目は空の返事。5. MiniStack はエミュレーターで、AWS ではない。よくある間違い:受け取るとメッセージが消えると思うこと。準備:ラボとそのターミナル。ヒント:実行ボタンを押す前に、それぞれの返事を予想させてください。Lambda は、その関数が生徒のコードをスタックの中で実行してしまうので、わざと止めてあります。メッセージ ID、受信ハンドル、時刻、キューのアドレスは、本物の AWS とも実行ごとにも違います。自分のモジュールにコピーして変更するか、レッスンビルダーのラボメニューから一から作ってください。