Slide 1

Slide 1 text

第90回 雲勉【オンライン︓初⼼者向け】 AWS App RunnerにLaravelをデプロイして LINEBotを作ってみよう 2022/12/08

Slide 2

Slide 2 text

アジェンダ 2 0. ⾃⼰紹介 1. AppRunnerとは(19:05~19:15) 2. AppRunnerにLaravelをデプロイ (19:15~19:25) 3. LINE Botの作成 (19:25~19:40) 4. まとめ (19:40~19:45) 5. 質疑応答(19:45~20:00)

Slide 3

Slide 3 text

0.講師⾃⼰紹介 3 n 名前 有本 史紀(ありもとふみのり) • クラウドインテグレーション事業部開発第⼆セクション • 過去3社ほどWebエンジニアとして活動 • 2020年5⽉アイレット ⼊社 • 主にLAMP環境でのアプリケーション開発に従事、アイレット ではそれに加えてLambdaでのサーバーレスアプリケーショ ン開発、Redshiftを使ったDWH開発などを⾏なっている

Slide 4

Slide 4 text

1. AppRunnerとは 4

Slide 5

Slide 5 text

1. AppRunnerとは 5 n 概要 • 「AWS App Runner は、コンテナ化されたウェブアプリケーションや API を開発者が簡単かつ迅速にデプロイ できるフルマネージド型サービスです。⼤規模に、しかも事前のインフラ経験を必要とせずにデプロイすること ができます。ソースコードからでも、コンテナイメージからでも始められます。App Runner は、ウェブアプリ ケーションを⾃動的に構築してデプロイし、暗号化を利⽤するトラフィックの負荷を分散し、トラフィックの ニーズに合わせてスケールし、お客様のサービスがプライベート Amazon VPC で実⾏される他の AWS のサー ビスやアプリケーションと簡単に通信できるようにします。App Runner を使⽤すれば、サーバーやスケーリン グについて煩わされることもなく、アプリケーションに集中できる時間が増えます。」 • → 裏側でFargateが実⾏されているので⾃動でスケーリング、AZ分散が⾏われる • → インフラに関する詳細な知⾒があまりなくてもコンテナアプリケーションをデプロイできる︕

Slide 6

Slide 6 text

1. AppRunnerとは 6 n AppRunnerでできること • AppRunner単体でWebアプリケーションを構築できる - 独⾃ドメインが払い出される • オートスケーリング • CI / CD環境構築 - ECRにDockerイメージがプッシュされたとき - Gitリポジトリにプッシュされたとき 対応している⾔語 (https://docs.aws.amazon.com/apprunner/latest/dg/service-source-code.html) • CloudWatch - メトリクス監視 - ログ管理 • Route53でのカスタムドメイン作成 • IAMで他のサービスとの連携を制御できる(ただしCLIの知識が必要)

Slide 7

Slide 7 text

1. AppRunnerとは 7 n AppRunnerでできないこと(2022年11⽉現在) • シークレットマネージャー、パラメータストアの連携 - 環境変数はAppRunnerのコントロールパネルから設定する • 複数のイメージ管理 - PHPだとNginxとPHP-FPMのイメージをタスク定義ファイルで連携するような⽅法は使えない • セキュリティグループにおけるインバウンド設定 • 別のサービスからInvokeする https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.AppRunner.AppRunnerClient.html 基本的にはhttpのエンドポイントでの実⾏

Slide 8

Slide 8 text

1. AppRunnerとは 8 n AppRunnerのユースケース • モバイルアプリやAPIのバックエンド • ⼩規模ウェブサイトのCMSシステム等 • アプリのプロトタイプ環境としての利⽤ • コンテナでのアプリケーション構築を試してみたい⼈

Slide 9

Slide 9 text

1. AppRunnerとは 9 n 今回はLINEBotを利⽤したアプリを作ってみよう 本⽇はブルーの枠内 • App Runner • ECR の説明を⾏います

Slide 10

Slide 10 text

1. AppRunnerとは 10 n 今回はLINEBotを利⽤したアプリを作ってみよう 完成サンプルイメージ

Slide 11

Slide 11 text

2. AppRunnerにLaravelをデプロイ 11

Slide 12

Slide 12 text

2.AppRunnerにLaravelをデプロイ 12 n 環境について • MacOS catalina • Docker version 20.10.6 • aws version aws-cli/2.1.36 • Laravel v9.21.6 • PHP v8.1.13 n 他に必要なもの • AWSアカウント • AppRunner、ECRの操作に関するロール • アクセスキーとシークレットキー • LINEアカウント

Slide 13

Slide 13 text

2.AppRunnerにLaravelをデプロイ 13 n アプリケーションの構造 docker/ (各種Dockerfile) ┣ ecs ┣ mysql ┣ nginx ┣ php src/ (Laravelベースのソースコード) ┣ app ・・・・

Slide 14

Slide 14 text

2.AppRunnerにLaravelをデプロイ 14 n Dockerfileについて PHPの開発はローカル環境はQiitaなどで調べると出てくる「nginx」と「php-fpm」を併⽤ する「docker-compose」を使⽤した構成を利⽤することが多い https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4

Slide 15

Slide 15 text

2.AppRunnerにLaravelをデプロイ 15 n Dockerfileについて ただ、この構成だと前述の通り、AppRunnerにはデプロイできない それで別途ECRにビルドするためのDockerfileをひとつ⽤意する

Slide 16

Slide 16 text

2.AppRunnerにLaravelをデプロイ 16 n Dockerfileについて

Slide 17

Slide 17 text

2.AppRunnerにLaravelをデプロイ 17 n ローカルでビルドしてみる docker build -t laravel-docker-aws -f ./docker/ecs/Dockerfile ./src

Slide 18

Slide 18 text

2.AppRunnerにLaravelをデプロイ 18 n ローカル環境で確認する docker run --rm -it -p 80:80 laravel-docker-aws http://localhostにアクセス

Slide 19

Slide 19 text

2.AppRunnerでLaravelをデプロイ 19 n コンテナイメージをECRにプッシュする コンソール画⾯ > Elastic Container Registry > レジストリの作成 「プッシュコマンドの表⽰」からコマンドを取得 aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 21xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com docker tag laravel-docker-aws:latest 21 21xxxxxxxxxx.dkr.ecr.ap-northeast- 1.amazonaws.com/laravel_sandbox:latest docker push 21 21xxxxxxxxxx.dkr.ecr.ap-northeast- 1.amazonaws.com/laravel_sandbox:latest

Slide 20

Slide 20 text

2.AppRunnerでLaravelをデプロイ 20 n ECRにプッシュする

Slide 21

Slide 21 text

2.AppRunnerでLaravelをデプロイ 21 n ECRにプッシュする

Slide 22

Slide 22 text

2.AppRunnerでLaravelをデプロイ 22 n ECRからAppRunnerにデプロイ 「コンソール画⾯」 > 「AppRunner」 > 「サービスの作成」

Slide 23

Slide 23 text

2.AppRunnerでLaravelをデプロイ 23 n ECRからAppRunnerにデプロイ 基本的にはデフォルトの設定のままでOK

Slide 24

Slide 24 text

2.AppRunnerでLaravelをデプロイ 24 n ECRからAppRunnerにデプロイ ポートを80に変更

Slide 25

Slide 25 text

2.AppRunnerでLaravelをデプロイ 25 n ECRからAppRunnerにデプロイ ビルドが終了すると「デフォルトドメイン」にアクセスできます

Slide 26

Slide 26 text

3. LINEBot作成 26

Slide 27

Slide 27 text

3. LINEBot作成 27 n LINEBotの考え⽅ • LINE Developersのアカウントにログインして「Create a new channel」から 「Messaging API」を作成する

Slide 28

Slide 28 text

3. LINEBot作成 28 n LINEBotの考え⽅ • WebhookのURLとして今回作成するAppRunnerのURLを指定する

Slide 29

Slide 29 text

3. LINEBot作成 29 n AppRunner側のアプリに必要なのは • チャンネルシークレット • チャンネルアクセストークン n LINEBotに必要なものは • WebhookURL

Slide 30

Slide 30 text

3. LINEBot作成 30 n Laravelでの実装⽅法 • 「LINE Messaging API SDK for PHP」をインストール • https://github.com/line/line-bot-sdk-php $ composer require linecorp/line-bot-sdk

Slide 31

Slide 31 text

3. LINEBot作成 31 n 実装イメージ

Slide 32

Slide 32 text

3. LINEBot作成 32 n Laravelでの実装⽅法 < routes/api.php > webhookの受け⼊れのルートを設定する Route::post('/webhook', [App¥Http¥Controllers¥LineWebhookController::class, 'index'])->name('api.webhook_index');

Slide 33

Slide 33 text

3. LINEBot作成 33 n Laravelでの実装⽅法(コントローラ) < app/controllers/LineWebhookController> <⼤切な部分> $httpClient = new CurlHTTPClient(config('line.line_channel_access_token')); $bot = new LINEBot($httpClient, ['channelSecret' => config('line.line_channel_secret')]); $signature = $request->header(HTTPHeader::LINE_SIGNATURE); $events = $bot->parseEventRequest($request->getContent(), $signature);

Slide 34

Slide 34 text

3. LINEBot作成 34 n Laravelでの実装⽅法

Slide 35

Slide 35 text

3. LINEBot作成 35 n Laravelでの実装⽅法 <Repositoryクラス>

Slide 36

Slide 36 text

3. LINEBot作成 36 n Laravelでの実装⽅法 <Botの設定ファイル>

Slide 37

Slide 37 text

3. LINEBot作成 37 n 今後のアップデート Botの設定ファイルについて ・完全⼀致 ・部分⼀致 に分けて設定していくことで精度をあげていく 今回はconfigファイルで設定しているが、 • S3のJsonファイルを取得する • DBを使⽤する 等のブラッシュアップを検討していく

Slide 38

Slide 38 text

3. LINEBot作成 38 n 今後のアップデート 完全⼀致でも部分⼀致でもキャッチできなかったテキストメッセージをDBに保存して分析する ことでユーザーの要望に対する精度をあげていく

Slide 39

Slide 39 text

4. まとめ 39 • AppRunnerはDockerfileひとつで⼿軽にデプロイ、CI/CDもできるのでコンテナベースのアプ リケーション⼊⾨におすすめです。 • LINE Botはバックエンドの設計に注⼒できるし、拡張性もあるので「何か作ってみたいけど 何を作ればいいかわからない」⽅におすすめです︕

Slide 40

Slide 40 text

4. まとめ 40 ありがとうございました m(__)m