$30 off During Our Annual Pro Sale. View Details »

第113回 雲勉【オンライン】AWS SAMを使ってLINE WORKS Botを作ってみた

iret.kumoben
September 07, 2023

第113回 雲勉【オンライン】AWS SAMを使ってLINE WORKS Botを作ってみた

iret.kumoben

September 07, 2023
Tweet

More Decks by iret.kumoben

Other Decks in Technology

Transcript

  1. 第113回 雲勉【オンライン】
    AWS SAMを使ってLINE WORKS Botを作ってみた

    View Slide

  2. 0.講師⾃⼰紹介
    2
    n 天野 典昭(あまの のりあき)
    • クラウドインテグレーション事業部 開発第⼆セクション
    • Webアプリケーション中⼼に開発エンジニアとして活動
    • 2019年7⽉⼊社
    • 趣味︓⾳楽全般(聴いたり観たり演奏したり…)

    View Slide

  3. アジェンダ
    3
    0.⾃⼰紹介
    1.今回の勉強会の概要
    2.AWS SAM とは
    3.AWS SAM 環境を作ってみる
    4.Bot を作成する
    5.まとめ

    View Slide

  4. 1. 今回の勉強会の概要
    4

    View Slide

  5. 1.今回の勉強会の概要
    5
    AWS SAMにてサーバーレス構成を構築し、その上でLINE WORKS Botを動かしてみる。
    ・AWS SAMでサーバーレスを構築する。(今回のメイン)
    ・その上で、サーバーレス構成に相性のいいLINE WORKS Botを動かしてみる。
    ・今回はAWS SAMに触れたことがないような⼈向けの⼊⾨レベルの内容であり、
    こんな流れでできるというところを確認する。
    ・Bot部分については、こういう感じで動かすことができるというレベルに留め、
    詳細な作成⽅法は省略する。

    View Slide

  6. 2. AWS SAM とは
    6

    View Slide

  7. 2.AWS SAMとは
    7
    AWS SAMとは・・・
    <AWS公式サイトより>
    AWS サーバーレスアプリケーションモデル (AWS SAM) は、サーバーレスアプリケーション構築⽤のオープンソースフレーム
    ワークです。迅速に記述可能な構⽂で関数、API、データベース、イベントソースマッピングを表現できます。リソースごとに
    わずか数⾏で、任意のアプリケーションを定義して YAML を使⽤してモデリングできます。
    簡単にいうと、
    Lambda、API Gateway、DynamoDB等を使ったサーバーレス構成を⼿軽に構築できるフレームワーク
    厳密には、サーバーレスに特化したCloud Formationの機能を拡張したもの
    SAM⽤に⽤意されたテンプレートを簡単に記述できる

    View Slide

  8. 2.AWS SAMとは
    8
    Cloud Formationのテンプレート記述例
    AWS SAMのテンプレート記述例
    AWS Black Beltより
    https://www.slideshare.net/AmazonWebServicesJapan/20190814-aws-black-belt-online-seminar-aws-serverless-application-model-165314501
    (例)Hello world出⼒のLambda関数を構築するスクリプト
    AWS SAMの⽅が簡単に記載できる

    View Slide

  9. 3. AWS SAM 環境を作ってみる
    9

    View Slide

  10. 3-1. 事前準備
    10

    View Slide

  11. 3-1.事前準備
    11
    AWS SAM CLIのインストール
    AWS SAMで環境を構築するためにCLIをインストールする必要がある。
    パッケージインストーラ、もしくはHomebrewによりインストールする。
    公式はパッケージインストーラを推奨。
    参考︓https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/install-sam-cli.html
    Homebrewコマンドによるインストール
    $ brew install aws/tap/aws-sam-cli
    インストール確認
    $ sam --version
    バージョンが確認できればOK。
    -> SAM CLI, version 1.95.0

    View Slide

  12. 3-2. アプリケーションテンプレートの作成
    12

    View Slide

  13. 3-2.アプリケーションテンプレートの作成
    13
    アプリケーションのテンプレート作成
    コマンドより、アプリケーションのテンプレートを作成できる。
    適当なディレクトリにて、以下の初期化コマンドを実⾏
    $ sam init
    様々なオプション指定することもできるが、省略すると対話式で各種設定を⾏う。
    コマンド実⾏後、設定に従ったアプリケーションのファイル⼀式が作成される。

    View Slide

  14. 3-2.アプリケーションテンプレートの作成
    14
    sam init コマンド実⾏結果

    View Slide

  15. 3-2.アプリケーションテンプレートの作成
    15
    項⽬ 内容
    Which template source would you like to use?
    1 - AWS Quick Start Templates
    2 - Custom Template Location
    AWSで⽤意されたテンプレートを使⽤するか⾃⾝で⽤意したカスタムテンプ
    レートを使⽤するか。
    今回は前者を選択。
    Choose an AWS Quick Start application template
    1 - Hello World Example
    2 - Data processing
    3 - Hello World Example with Powertools for AWS Lambda
    4 - Multi-step workflow
    5 - Scheduled task
    6 - Standalone function
    7 - Serverless API
    8 - Infrastructure event management
    9 - Lambda Response Streaming
    10 - Serverless Connector Hello World Example
    11 - Multi-step workflow with Connectors
    12 - Full Stack
    13 - Lambda EFS example
    14 - Hello World Example With Powertools
    15 - DynamoDB Example
    16 - Machine Learning
    どのテンプレートを使⽤するか。
    今回は1を選択。
    Use the most popular runtime and package type? (Python and zip) [y/N]: Pythonとzipでのアップロード構成にするか。
    今回はNoを選択。
    sam init コマンドの対話式で設定する内容 (1/3)

    View Slide

  16. 3-2.アプリケーションテンプレートの作成
    16
    項⽬ 内容
    Which runtime would you like to use?
    1 - aot.dotnet7 (provided.al2)
    2 - dotnet6
    3 - go1.x
    4 - go (provided.al2)
    5 - graalvm.java11 (provided.al2)
    6 - graalvm.java17 (provided.al2)
    7 - java17
    8 - java11
    9 - java8.al2
    10 - java8
    11 - nodejs18.x
    12 - nodejs16.x
    13 - nodejs14.x
    14 - python3.9
    15 - python3.8
    16 - python3.7
    17 - python3.11
    18 - python3.10
    19 - ruby3.2
    20 - ruby2.7
    21 - rust (provided.al2)
    どの⾔語を使⽤するか。
    今回はpython3.8を選択。
    sam init コマンドの対話式で設定する内容 (2/3)

    View Slide

  17. 3-2.アプリケーションテンプレートの作成
    17
    項⽬ 内容
    What package type would you like to use?
    1 - Zip
    2 - Image
    LambdaのデプロイをZipにするかImageにするか。
    今回はZipを選択。
    Would you like to enable X-Ray tracing on the function(s) in your
    application? [y/N]:
    X-Rayトレースを有効にするか。
    今回はNoを選択。
    Would you like to enable monitoring using CloudWatch Application
    Insights?
    For more info, please view
    https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/clo
    udwatch-application-insights.html [y/N]:
    CloudWatch Application Insightsによるモニタリングを有効にするか。
    今回はNoを選択。
    Project name [sam-app]: プロジェクト名を何にするか。
    今回はデフォルトの sam-app を設定。
    sam init コマンドの対話式で設定する内容 (3/3)

    View Slide

  18. 3-2.アプリケーションテンプレートの作成
    18
    sam init コマンドにより⾃動作成されるファイル⼀式
    今回は template.yaml、hello_world/app.py の内容を確認する。
    フォルダ/ファイル 内容
    eventsフォルダ Lambdaに送られるイベント情報(テスト⽤)
    testsフォルダ テスト⽤コード
    hello_worldフォルダ メイン処理となるLambda関数
    samconfig.toml プロジェクトの設定を構成
    template.yaml SAMテンプレート

    View Slide

  19. 3-2.アプリケーションテンプレートの作成
    19
    ⾃動⽣成された template.yaml

    View Slide

  20. 3-2.アプリケーションテンプレートの作成
    20
    ⾃動⽣成された template.yaml
    ヘッダ部︓テンプレートの情報を定義
    Globals セクション︓共通のプロパティを定義
    Resources セクション︓リソース情報を定義
    Outputs セクション︓スタックのプロパティを表⽰するたびに
    返される値

    View Slide

  21. 3-2.アプリケーションテンプレートの作成
    21
    ⾃動⽣成された template.yaml
    ヘッダ部︓テンプレートの情報を定義
    Globals セクション︓共通のプロパティを定義
    Outputs セクション︓スタックのプロパティを表⽰するたびに
    返される値
    テンプレートのメイン部分であり、
    主にこの部分を記述していく。
    Resources セクション︓リソース情報を定義

    View Slide

  22. 3-2.アプリケーションテンプレートの作成
    22
    template.yaml – Resources セクション
    リソース情報を定義する。
    Typeにどのリソースを構築するかを指定し、Propertiesにその詳細設定を定義する。
    デフォルトのテンプレートでは、Lambda関数作成のためのFunctionのみ定義されている。
    Type︓リソースのタイプを定義
    Properties︓リソースに関する設定を定義

    View Slide

  23. 3-2.アプリケーションテンプレートの作成
    23
    Type 内容
    AWS::Serverless::Function AWS Lambda 関数、AWS Identity and Access Management (IAM) 実⾏ロール、およびこの関数をトリガーする
    イベントソースマッピングを作成
    AWS::Serverless::Api HTTPS エンドポイント経由で呼び出すことができる Amazon API Gateway リソースとメソッドのコレクションを
    作成
    AWS::Serverless::SimpleTable 単⼀属性のプライマリキーで DynamoDB テーブルを作成
    AWS::Serverless::LayerVersion Lambda 関数に必要なライブラリまたはランタイムコードが含まれる Lambda LayerVersion を作成
    AWS::Serverless::Application Serverless Application Repositoryに存在するアプリケーションを作成
    Resourcesに指定できる主なType

    View Slide

  24. 3-2.アプリケーションテンプレートの作成
    24
    ⾃動⽣成された app.py

    View Slide

  25. 3-2.アプリケーションテンプレートの作成
    25
    ⾃動⽣成された app.py
    ⾃動⽣成されたコードは hello world を返すのみ。
    実際にはここにいろいろ処理を書いていくが、
    今回はひとまずそのままの処理とする。

    View Slide

  26. 3-3. アプリケーションのデプロイ
    26

    View Slide

  27. 3-3.アプリケーションのデプロイ
    27
    アプリケーションのビルド
    ここまでで作成したアプリケーションをビルドする。
    以下のコマンドによりビルドする。
    $ sam build
    デフォルトのままであれば、Hello worldを返すアプリケーションが問題なくビルドされる。

    View Slide

  28. 3-3.アプリケーションのデプロイ
    28
    アプリケーションのデプロイ
    以下のコマンドにより、ビルドしたアプリケーションをデプロイする。
    $ sam deploy --guided
    guidedオプションを指定することで対話式でデプロイできる。
    環境に合わせて適宜設定しつつ、基本的にはデフォルトのままでも問題ないが、
    「HelloWorldFunction has no authentication. Is this okay?」に対しては y を選択する。
    ⇒これは認証なしのAPIが存在するが問題ないかという質問であるが、今回はテスト⽤のため問題なしと回答する。

    View Slide

  29. 3-3.アプリケーションのデプロイ
    29
    エンドポイントの確認
    デプロイが成功すると、Lambdaにアプリケーションが⽣成されている。
    今回はAPIトリガーでLambda関数が実⾏されるように設定しているため、
    そのエンドポイントを確認しておく。

    View Slide

  30. 3-3.アプリケーションのデプロイ
    30
    エンドポイントの確認
    今回作成したアプリケーションが問題なく動作しているか確認するため、
    APIエンドポイントに今回作成したLambdaのpathに指定した hello を付与してアクセスしてみる。
    SAMテンプレート
    hello worldを返すことが確認できる。

    View Slide

  31. 4. Bot を作成する
    31

    View Slide

  32. 4.Botの作成
    32
    Botの作成
    LINEWORKS Developer Console (*1) に⼊り、Botメニューか
    らBotを作成する。
    このとき、Callback URLには先程作成したアプリケーションの
    URLを指定する。これにより、ユーザーがメッセージを送信した
    ときに、ここで指定したAPIが呼ばれるようになる。
    (*1) https://developers.worksmobile.com/jp/
    アカウントは事前に作成しておく。

    View Slide

  33. 4.Botの作成
    33
    Lambda関数の修正
    Botがメッセージを送信するようにLambdaのソースコード app.py を修正する。
    Callbackで呼ばれたLambda関数のevent変数には、ユーザー情報や送信メッセージ等の情報が⼊っている。
    それらの情報を参照しながら、Botから送信するメッセージを⽣成してレスポンスを返す。
    詳細はLINE WORKS API ドキュメント参照
    https://developers.worksmobile.com/jp/docs/api/

    View Slide

  34. 4.Botの作成
    34
    Lambda関数の修正
    今回は、ユーザーから送信されたメッセージを参照し、
    「送信されたメッセージは *** です」を返すように修正。
    ※ 全体のソースコードは省略

    View Slide

  35. 4.Botの作成
    35
    SAMテンプレートの修正
    Callbackで呼ばれるAPIはPostである必要があるため、template.yamlを修正する。
    修正後は再度ビルド、デプロイを⾏う。
    SAMテンプレート

    View Slide

  36. 4.Botの作成
    36
    動作確認
    ユーザー側からメッセージを送信し、それに応じてBotがメッセージを返すことを確認する。

    View Slide

  37. 5. まとめ
    37

    View Slide

  38. 5.まとめ
    38
    ・AWS SAMはサーバーレス構成に特化したフレームワークである。
    ・テンプレートが⽤意されており、それをベースに構築することができる。
    ・テンプレートはCloud Formationよりも簡単に記述できる。
    ・事前にテンプレートを定義しておくことにより、それに従った環境が⼿軽に再現できる。
    ・ローカル環境でも動作確認ができ、パラメータも定義できる。(今回は省略)

    View Slide

  39. ご視聴ありがとうございました
    39

    View Slide