AWS アカウントなしで AWS を教える:生徒全員に S3・DynamoDB・SQS

クラウドサービスは、現代のソフトウェアのなかでも、教室ではほとんど教えられない分野です。オブジェクトストレージについて読むことと、実際にバケットにファイルを置くことは別物です。そこにたどり着く普通の方法は、AWS アカウントを作り、カードを登録し、経理担当に説明したくない請求書を受け取ることです。多くの学校は、図で説明するところから先へ進めません。

ここでは、生徒が「クラウド」タブで「起動」を押すだけで、3つのサービスが使えます。Amazon S3、DynamoDB、SQS の API で応答するオブジェクトストレージ、NoSQL テーブル、メッセージキューです。そのため boto3、JavaScript・Java・Go 用の AWS SDK、AWS CLI がいずれもそのまま動き、生徒がここで書くコードは、本物のアカウントに対して書くコードと同じです。

スタックは生徒本人専用で、使い終われば消え、料金はかかりません。当社は Amazon Web Services とは提携しておらず、これは AWS アカウントではありません。オープンソースのエミュレーターである MiniStack を、生徒のアプリと同じマシン上で動かしています。AWS、Amazon S3、DynamoDB、Amazon SQS は Amazon.com, Inc. またはその関連会社の商標であり、ここではスタックがどの API を実装しているかを示すためにのみ記載しています。

生徒が使えるもの

スタックは生徒1人に1つずつ、その生徒のアプリ、データベース、ターミナルと同じプライベートネットワーク上に用意されます。セッション内のどこからでも `cloud` という名前で接続できるため、チュートリアルの設定がそのまま使え、URL をコピーする必要もありません。

起動すると、どの AWS SDK も最初から読み取る環境変数が設定されます。`AWS_ENDPOINT_URL`、その生徒用に作られたアクセスキーとシークレット、そして `AWS_REGION` です。そのため引数なしの `boto3.client("s3")` だけでスタックにつながり、設定も URL のコピーも要りません。

スタックは、新しいアカウントと同じく空の状態で始まります。バケット、テーブル、キューは、生徒が自分のコードから、または「クラウド」タブで自分で作ります。`put_object` の前に `create_bucket` が必要なことも、演習で学ぶ内容の一部です。

認証情報は自動で生成され、生徒が決めるものではありません。各変数が何を意味するかを生徒が読めるよう、ページに表示されます。

  1. 「クラウド」タブを開く. 「デプロイ」の下、「アプリ」と「データベース」の隣にあります。スタックは生徒1人に1つです。
  2. 「起動」を押す. スタックは数秒で起動します。新しいアカウントと同じく、中身は空です。
  3. 環境変数を確認する. エンドポイント、キーペア、リージョンがページに表示されます。どの AWS SDK も、これらを環境から自動で読み取ります。
  4. コードを書く. 自分のアプリでもターミナルでも書けます。`aws s3 ls`、`boto3.client("s3")`、あるいは JavaScript・Java・Go の SDK。設定は要りません。
  5. 作ったものを確認する. 同じページのコンソールに、コードが書き込んだバケット、キー、テーブル、アイテム、キューのメッセージがその都度一覧表示されます。
生徒の「クラウド」タブ。アプリ、データベース、クラウドスタック、ターミナルを含むセッションと、スタックを作成するボタンが表示されている
スタックは生徒1人に1つずつ、アプリやデータベースと同じプライベートネットワーク上にあります。

AWS マネジメントコンソールの代わりに、ブラウザー内のコンソール

起動中のスタックには、ページ上のコンソールがあり、「オブジェクトストレージ(S3)」「NoSQL データベース(DynamoDB)」「キュー(SQS)」の3つのタブに分かれています。各タブには、スタック内のその種類のもの(バケット、テーブル、キュー)がすべて一覧表示され、それぞれの横に「削除」が、下に追加用の入力欄があります。1つ選ぶとその下に開きます。「オブジェクトストレージ」では、選んだバケットの中身がキー全体で一覧表示され、それぞれにダウンロードがあります。生徒が入力したキーでアップロードでき、バケットの作成と削除もできます。「NoSQL データベース」ではテーブルを一覧表示し、スキャンし、アイテムを1件ずつ編集できます。「キュー」では各キューにたまっている件数が表示され、メッセージの送信、待機中のメッセージの確認、1件の削除、全件の消去ができます。

オブジェクトストレージに表示されるのはキーであり、フォルダーではありません。フォルダーという仕組み自体がなく、フォルダーのように見えるのは先頭が同じキーの集まりです。photos/2026/cat.png はスラッシュを含む1つの名前です。生徒自身の list_objects_v2 が返すのもこの形なので、ページもそのとおりに表示します。また、ここではファイルの編集も削除もできません。バケットの中身を変えるのは、生徒が作っているアプリの役目だからです。ただし、バケットを削除すると中身も一緒に削除されるため、その前に、何が消えるかを示して確認します。

キューの中を見ても、メッセージが取り出されることはありません。メッセージはすぐに戻されるので、生徒は自分のプログラムがキューを読み取っている最中でも、そのキューを見ていられます。これはコンソールがよく誤る点で、正しく動いているプログラムが壊れているように見える原因でもあります。

コンソールは表示するだけでなく、作成もできます。バケット、整理に使うキーを指定したテーブル、キューを、同じ3つのタブから作成・削除できます。そのため生徒は、まず手作業でストレージを用意し、その後でそれを使うコードを書けます。これは多くのチュートリアルが教える順番です。

アイテムは、テーブルが実際に保存している型付きの形式で表示されます。生徒自身のコードが読み戻すのも、その形式だからです。

コンソールからは 1.0 MB までのファイルをアップロードでき、2.0 MB までダウンロードできます。一覧には先頭の200オブジェクト、スキャンには先頭の100行、メッセージの確認には10件までが表示されます。生徒自身のプログラムにはこうした制限はなく、それより大きなものはターミナルで扱えます。

ブラウザーのターミナルで AWS CLI を使う

3つのタブのどれからでも「ターミナルを開く」を押すと、セッションの隣に本物のシェルが開き、AWS CLI は最初からスタックに接続されています。`aws s3 ls`、`aws s3 cp`、`aws dynamodb scan`、`aws sqs send-message` がいずれも、`configure` の手順も `--endpoint-url` もなしで動きます。コンソールにない操作はここで行えます。大きなファイルは、ブラウザーではなくここで扱います。

コンソールで扱えるのは、アップロードが 1.0 MB まで、ダウンロードが 2.0 MB までのファイルです。生徒自身のプログラムにはこの制限はなく、スタックに直接書き込みます。

何が、どのくらいの期間保存されるか

スタック全体は、停止時に1つのアーカイブとして保存され、起動時に復元されます。容量は中身すべてを合わせて 25 MB までです。ページには使用量が表示され、上限に達した後ではなく、達する前に警告します。オブジェクトストレージを読み取り専用にする方法はないため、前もって気づけるようにするのが誠実なやり方だからです。

データベースと同じ利用枠で動き、保証時間、上限、放置されたときのルールも同じです。そのため、起動したままのスタックが、知らないうちに誰かの1日分の時間を使い切ることはありません。

課題として出す

デプロイフォームでスタックにチェックを入れると、環境変数が設定された状態でアプリと一緒に起動します。そのため「アップロードを S3 バケットに保存する Flask アプリ」「SQS キューを読み取るワーカー」「DynamoDB テーブルを使うページ」といった課題を出せます。どれも業界ではごく普通の作業ですが、これまでは生徒ごとに AWS アカウントがなければ、課題にすること自体ができませんでした。

デプロイされた提出物を採点する人は、生徒が残したままの状態のスタックを使えます。その変更が保存し直されることはないため、アプリを試しても、生徒の採点対象は何も変わりません。

よくある質問

生徒は AWS アカウントなしで AWS を学べますか?
はい。生徒はそれぞれ、Amazon S3、DynamoDB、SQS の API を実装したオブジェクトストレージ、NoSQL テーブル、メッセージキューを使えるため、boto3 や AWS SDK、AWS CLI を使って、AWS に対して書くのと同じコードを書けます。AWS アカウントもクレジットカードも請求もありません。オープンソースのエミュレーターである MiniStack を生徒のアプリと同じマシン上で動かしているもので、AWS アカウントではありません。ここにあるものは、どれも公開インターネット上にはありません。
生徒はどの SDK をインストールすればよいですか?
使う言語向けの通常の AWS SDK です。Python なら boto3、JavaScript・Java・Go なら AWS SDK、ブラウザーのターミナルなら AWS CLI v2 です。いずれも AWS_ENDPOINT_URL、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION を環境から読み取り、スタックはこの4つすべてを設定するので、チュートリアルのコードは設定なしでそのまま動きます。
どの AWS サービスに対応していますか?
最初の授業で必要な3つです。オブジェクト用の Amazon S3、NoSQL テーブル用の DynamoDB、キュー用の Amazon SQS で、これはこのプラットフォーム自身が使っている 3つでもあります。MiniStack のイメージがエミュレートするその他のサービスも付いてきますが、コンソールに表示され、当社がサポートするのはこの3つです。
これは Amazon Web Services と提携していますか?
いいえ。MitsuruTech は Amazon Web Services と提携しておらず、その承認や後援も受けていません。AWS、Amazon S3、DynamoDB、Amazon SQS は Amazon.com, Inc. またはその関連会社の商標であり、ここではスタックがどの API を実装しているかを示すためにのみ記載しています。これは一般的なチュートリアルやエミュレーターと同じ扱いです。
生徒同士でお互いのスタックを見られますか?
いいえ。スタックは持ち主専用のプライベートネットワーク上にあり、外との出入り口がないため、このサイトのほかの部分も含め、そのセッションの外からは一切接続できません。コンソールは、生徒自身のセッションに処理を依頼することで動いています。
ゲストも使えますか?
はい。ゲストは、クラウドスタックとデータベースを同時に1つずつ持てます。スタックはデータベースの数に含まれず、「デプロイ」ページの「このサンプルをデプロイ」で両方が作られます。ゲストのアカウントは最後に使ってから24時間保持され、デプロイ1回あたり最長30分動作するので、スタックもその範囲に収まります。「このアカウントを残す」で正式なアカウントになります。