Chapter11 Hands-On #5 : サーバーレス入門

概要

 この章では,Lambdaのワークフローを体験する。具体的には,以下の通りである。

  1. AWS CDKを使用してPythonで書かれたコードをLambdaに登録する。
  2. Invoke APIを使用して同時にいくつものLambdaを起動し,並列な計算を行う。

Lambdaハンズオン

 先程説明した,Lambdaのワークフローを実際に行っていく。

デプロイ

 以下のコマンドを実行して,デプロイを行う。(シークレットキーの設定もすること)

# プロジェクトのディレクトリに移動
$ cd handson/serverless/lambda

# venvを作成し,依存ライブラリのインストールを行う
$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirements.txt

# デプロイを実行
$ cdk deploy

 デプロイが行われると,以下のような出力が得られる。


 AWSコンソールから,Lambdaのページに行くと,以下の画像のような画面があり,Lambdaの関数の一覧が確認できる。
 (SimoleLambda以降はランダム)

 表示された名前をクリックすると,先程のプログラムの中で定義したPythonの関数がエディターに表示される。さらに下にスクロールをすると,関数の各種設定も確認できる。

Lambda関数の実行

 以下のコマンドで,Lambdaの関数を実行する。以下全てのコマンドの「XXXX」の部分は,先程デプロイした際に出力された「SimpleLambda.FunctionName = XXXX」の「XXXX」の部分で置き換える。

$ python invoke_one.py XXXX

 実行結果は以下に示す。
 クラウド上で先程の関数が走り,乱数が生成されたうえで,ランダムな寿司ネタが選択されて出力されている。複数回実行すれば,異なる出力が得られることがわかる。


 先程のコマンドでは一度に1回の関数を実行したが,Lambdaでは一度に大量のタスクを実行することができる。試しに今度は,以下のコマンドを実行して,100個のタスクを同時に送信してみる。

$ python invoke_many.py XXXX 100

 すると,以下のような出力が得られる。

 実際に100個のタスクが実行されていることを,AWSのコンソール画面から確認してみる。

  • Invocations:関数が何度実行されたかを示す
  • Concurrent executions:何個のタスクが同時に行われたかを意味する

スタックの削除

 最後に,スタックを削除して終了。

$ cdk destroy

DynamoDBハンズオン

 次に,DynamoDBの簡単なチュートリアルをやってみる。流れは,以下の通りである。

 1. AWS CDKを使用してDynamoDBのテーブルを初期化し,デプロイする。  2. APIを使用してデータベースのデータの書き込み,読み出し,削除などの操作を行う。

デプロイするプログラムの中身

 handson/serverless/dynamodb/app.pyに,デプロイするプログラムが書かれており,これにより最低限の設定がなされたDynamoDBのテーブルが作成される。そのプログラムの一部を以下に示し,要点を書き留めておく。

class SimpleDynamoDb(core.Stack):
    def __init__(self, scope: core.App, name: str, **kwargs) -> None:
        super().__init__(scope,name**kwargs)
        
        table = ddb.Table(
          self, "SimpleTable",
          ①
          partition_key=ddb.Attribute(
            name="item_id",
            type=ddb.AttributeType.STRING
            ),
            ②
            billing_mode=ddb.BillingMode.PAY_PER_REQUEST,
            ③
            removal_policy=core.RemovalPolicy.DESTROY
        )

① partition_key
 すべてのDynamoDBテーブルに定義されている。テーブル内の要素(レコード)ごとに存在するIDのことであり,同一のテーブル内に同じpartition_keyをもった要素が2つ以上あることはない(Sort_Keyを使用している場合を除く)。ここでは,Partition Keyにitem_idという名前を付けている。

②billing_mode
 ddb.BillingMode.PAY_PER_REQUESTを指定することで,On-demand Cpapacity ModeのDynamoDBが作成される。(他に,PROVISIONEDというモードもあるが,かなり高度なケーズ以外では基本使用しない)
 両方について参考になるサイトがあったので,リンクを張っておく。

DynamoDBのキャパシティモード - nullpo.io

③removal_policy
 CloudFormationのスタックが消去されたときに,DynamoDBも一緒に消去されるかどうかを指定する。ここではDESTROYを選択しているので,すべて消去される。他の選択肢としては,スタックを消去してもDynamoDBのバックアップを残す,などがある。

デプロイ

 以下のコマンドを実行して,デプロイを行う。

# プロジェクトのディレクトリに移動
$ cd handson/serverless/dynamodb

# venvを作成し,依存ライブラリのインストールを行う
$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirements.txt

# デプロイを実行
$ cdk deploy

 デプロイが成功すると,以下のような出力が得られる。

 また,AWSコンソールからDynamoDBのページに行くと,テーブルの一覧が確認できる

 さらに,”SimpleDynamoDb”で始まるランダムな名前のテーブルをクリックし,”Explore Items”からテーブルの中のレコードを確認できる。(現時点では空)

データの読み書き

 先ほど作成したテーブルを使って,データの読み書きを実行してみる。ここでは,Pythonとboto3ライブラリを用いた方法を紹介する。
 まず,以下のコマンドより”simple_write.py”を実行してみる。

$ python simple_write.py XXXX

 正しく実行され,新しい要素が書き込まれたかAWSコンソールから確認してみる。

 さらに,以下のコマンドより,この要素を読み出すことも可能である。

$ python simple_read.py XXXX

実行結果を以下に示す。先程書き込んだ要素が出力されている事が分かる。

大量のデータの読み書き

 batch_rw.pyには,一度に大量の書き込みを実行するためのプログラムが書いてある。以下のコマンドを実行すると,ランダムなデータ1000個がデータベースに書き込まれる。

$ python batch_rw.py XXXX write 1000

 今回書き込んだデータには,”age”という属性に1~50のランダムな整数が割り当てられている。例として,以下のコマンドを実行して,”age”が2以下である要素だけを検索して拾ってみる。

$ python batch_rw.py XXXX search_under_age 2

実行結果

スタックの削除

 以下のコマンドを実行して,スタックを削除して終了。

$ cdk destroy

S3ハンズオン

 S3の簡単なチュートリアルを行う。流れは,以下の通りである。

 1. AWS CDKを用いて,S3に新しい空のバケットを作成する。  2. データのアップロード,ダウンロードの方法を説明する

デプロイ

 以下のコマンドを実行して,デプロイを行う。

# プロジェクトのディレクトリに移動
$ cd handson/serverless/s3

# venvを作成し,依存ライブラリのインストールを行う
$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirements.txt

# デプロイを実行
$ cdk deploy

 デプロイが完了すると,以下のような出力が得られる。

データの読み書き

 以下のコマンドを実行して,”temp.txt”という仮のファイルを生成する。

$ echo "Hello world!" >> temp.txt

 次に,”simple_s3.py”を使って,”temp.txt”を以下のコマンドによりバケットにアップロードする。

$ python simple_s3.py XXXX upload temp.txt

 また,以下のコマンドを実行することでKeyを指定してアップロードを実行することもできる。

$ python simple_s3.py XXXX upload temp.txt --key a/b/temp.txt

 ここで,AWSコンソールよりアップロードされたS3の中身を確認してみる。

 先程のコマンドのように,Keyを”/”で区切ったことで,ツリー状の階層構造によってファイルを管理することができるようになる。
 しかし,オブジェクトストレージには本来ディレクトリという概念はない。これはあくまで,ユーザビリティの向上のためである。

 次に,以下のコマンドよりバケットからファイルのダウンロードを実行してみる。
 そして,一度”temp.txt”を削除した後に実行することで,ダウンロードされたことを確認する。

$ python simple_s3.py XXXX download temp.txt

スタックの削除

 以下のコマンドを実行して,スタックを削除して終了。

$ cdk destroy