【AWS勉強】AWS Lambda実践ガイド第2版

 

 

購入した経緯

業務でLambdaを使った開発作業に携わることが多く、API GatewayやSQS・DynamoDBと連携して動作するシステムの構築をした際もモヤモヤしたままの状態だったので、1からしっかり勉強しようと購入。

手を動かしたこと

1〜3章まではLambdaで開発する上で必要な操作方法などの基礎的な知識が記載された部分だったので、「うんうん、そうだよね」といった感じでさらっと流し読みした。

4章からは実際にプライベートのAWSアカウントを使用して、ハンズオンを実施した。

  • Cloud9でのLambda開発
    • sam initで基本のSAMプロジェクトの作成
    • ビルド・デプロイ
      • SAMでデプロイしたリソースはマネコンで変更しないこと
        • マネコンで変更しても、再度デプロイしたときにCloudFormationで作り直されるので、template.yamlを変更してデプロイする
    • ローカル環境でLambdaをテストする
    • S3バケットのイベントを扱う方法や、S3を操作する方法
      • S3バケットのイベントの設定
      • S3バケットのイベントと操作
      • ライブラリを必要とするLambda関数
  • ユーザー登録した人だけが、登録ユーザー専用コンテンツをダウンロードできるシステムの構築
    • API GatewayとLambda関数を組み合わせてHTTPプロトコルからLambda関数を呼び出す構成
    • API Gatewayを呼び出すHTMLフォームを作り、静的ウェブサイトホスティングを有効にしたバケットに配置する
    • HTMLフォームから受け取ったデータをDynamoDBに書き込む処理
    • Lambda関数内に署名付きURLを発行する処理を実装し、コンテンツをダウンロードする期間を制限する
    • SESを使い、署名付きURLを含む文面のメールを送信する仕組みを作る

ハマったところ

DynamoDBテーブルの属性更新「update_item()」メソッドに設定する引数が理解できてなかったがそれなりにわかるようになった。(boto3のドキュメントでは「???」となっていた)

# テーブルに入っている値にプラス1して返す関数
def next_seq(table, tablename):
    response = table.update_item(
        Key={
            'tablename' : tablename
        },
        UpdateExpression="set seq = seq + :val",
        ExpressionAttributeValues= {
            ':val' : 1
        },
        ReturnValues='UPDATED_NEW'
    )
  return response['Attributes']['seq']

Key

対象となる項目を特定するキー。

「tablename属性がtablename変数に入っている値であるものを対象とする」という意味になる。

UpdateExpression

更新式

seq属性をseq属性の値に「:valというパラメータの値」を足したものを設定する、という意味になる。

パラメータの名称は「:」で始まる。:valというパラメータは次のExpressionAttributeValuesで指定する。

ExpressionAttributeValues

UpdateExpressionの式で使用するパラメータ。

':val' : 1

「:val」というパラメータに「1」を設定するという意味になる。すなわち、

set seq = seq + 1

という意味になりseqの属性値が「1増える」という挙動になる。

ReturnValues

戻り値にどのような値を返すかを指定する。

先ほどのコードでは「'UPDATED_NEW'」を指定しているので、「更新したあとの新しい値」が戻り値として返される。

【ReturnValuesの取り得る値】

'NONE':値を返さない

'ALL_OLD':追加・更新・削除されたすべての「元の値」を返す

'UPDATED_OLD':更新した「元の値」を返す

'ALL_NEW':追加・更新したすべての「新しい値」を返す

'UPDATED_NEW':更新したすべての「新しい値」を返す

 

1回目としてざっとハンズオンしてみたので、2周目では同じようなシステムを自分で応用してやってみたい。