kakakakakku blog

Weekly Tech Blog: Keep on Learning!

「JAWS-UG 朝会 #5」で Slack のスラッシュコマンドを実装した

毎月楽しみにしている 「JAWS-UG 朝会」に参加してきた.今回で3回目!

jawsug-asa.connpass.com

テーマ

今回のテーマは Slack のスラッシュコマンド(独自に拡張できる /xxx コマンド)をサーバレスアーキテクチャ(API Gateway + Lambda)で構築するというテーマだった.実際には Lambda の BluePrint "slack-echo-command" を CLI で構築した.特に API Gateway の CLI 操作は叩くエンドポイントが多くて複雑だなー!簡単に図にすると以下のような感じ.

f:id:kakku22:20160830175952p:plain

今回は Slack で "/sayhello xxx" と入力すると "xxx" の部分が返ってくるという実装だった.少し気になるのは "Only visible to you" なメッセージで返ってきているところで,これだと自分以外には表示されず,チームで使う ChatBot としては機能しないなと思っている.通常のメッセージとして表示するにはどうするんだろう.

f:id:kakku22:20160830220527p:plain

前に似た構成で MarvelBot を作ったときは Outgoing Webhooks を使ったけど "Only visible to you" にならなかったしなぁ.復習も兼ねてもう少し調べてみようかなと思う.

kakakakakku.hatenablog.com

資料

qiita.com

qiita.com

qiita.com

Serverless Framework

自己紹介のときに Serverless Framework のことを簡単に紹介した.CLI も良いけど,継続的なデプロイなどを考えると Serverless Framework などのラッパーライブラリを使う方が開発プロセスに乗せやすいなと思う.裏は CloudFormation だけど,スタックを意識することは無いし,JSON を書く必要もないし,CloudFormation 特有の厳しさはないのかなと.前に入門記事を書いたから載せておく!

kakakakakku.hatenablog.com

次回

既に10月まで公開されている.引き続き参加するぞ!

jawsug-asa.connpass.com

jawsug-asa.connpass.com

過去に参加した JAWS-UG 朝会

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

「実践 SERVERLESS」に参加して Lambda 管理ツールの多さに驚いた

募集開始になってすぐ申し込んだ「実践 SERVERLESS」に参加してきた.

classmethod.connpass.com

Introducing Serverless Computing / @Keisuke69

  • AWS で Serverless と言うと Lambda
  • 特徴はアーキテクチャ上に EC2 が出てこないこと
  • Alexa と Slack と連携して Serverless な Bot を動かす事例がある
  • CloudTrail で S3 に出力されたログを Lambda で監視して特定の設定変更を検知する事例がある
  • VidRoll で広告配信基盤を Lambda にリプレイスした事例がある


AWS Lambda と Amazon API Gateway の管理 / @suwa-yuki

最高に勉強になった発表だった!

今まで Lambda を使うときは自分で ZIP を作成して管理コンソール(もしくは API)から Lambda function を作成していて,あくまで検証目的で使っていたので,管理ツールは使ったことがなかった.もし業務で使うとなったらデプロイの仕組みは整える必要があるから,ロールバックの要否だったり,環境変数の管理など,気になるポイントも多く,管理ツールを使うと便利なんだろうなと感じた.特に API Gateway は管理コンソールを使ったとしても設定が複雑だし,画面遷移も混乱するから,管理ツールに任せられたら安心感がある.ただ質疑応答にもあったけど,結局 API を叩いているため,管理ツールで非対応の設定は管理コンソールを使う必要があって,完全自動化は難しいとのことだった.だからこそ AWS 純正の CloudFormation や Flourish を使うメリットがあるという話も出ていた.

使ったことはないけど cloudinfra-audio Podcast で紹介されていた Lamvery も Lambda の管理ツールだよなーと思ったりした.

cloudinfra.audio

github.com

speakerdeck.com

実際に使う Cognito UserPools / @yuukigoodman

  • Serverless とは「非常駐型プロセス」のことである
  • 目的は EC2 無しで運用コストと金銭コストを削減する
  • 別に Lambda だけじゃない
    • Cognito も Serverless だ
  • Cognito Identity
  • Cognito Sync
  • Cognito User Pools
    • AWS が提供する Identity Provider
    • デモ
      • 簡単にログイン機構を作れる
      • パスワードポリシーも設定できる
      • 電話番号などログイン時に特定の属性も取得できる
    • Lambda Trigger を使って Cognito からビジネス的な KPI を集計したりすることもできる

Cognito の前提知識が全く無かったから,話を聞きながら Cognito のことを調べたりして,勉強していた.アプリケーションを実装するときにログイン機構は結構重要で,その部分をフルマネージドに Cognito に任せられるのは個人的に未来感があると感じたし,確かに Serverless だな!と感じた.デモも凄く良かった.

speakerdeck.com

関連記事

dev.classmethod.jp

まとめ

Lambda の管理ツールの多さに驚いた.試しに使ってみようと思う.特に近日公開となっている Flourish には期待かな!早いとこ Lambda を実戦投入できそうな案件を探して「Serverless やってるぞ!」って言いたいなぁ!

早起きをして「JAWS-UG 朝会 #4」に参加してきた

先月に引き続きで,朝 7:30 から開催される「JAWS-UG 朝会 #4」に参加してきた!前回「アルコタワー」と「アネックス」を間違えてご迷惑をお掛けした反省を活かして,今回は時間に余裕を持って目黒に到着して,目黒川付近で朝ポケモンを楽しんでいた.

jawsug-asa.connpass.com

kakakakakku.hatenablog.com

テーマ

第4回のハンズオンテーマは「AWS CLI を使って SQS / CloudWatch / SNS / Lambda を連携する BluePrint を動かす!」だった.具体的には CloudWatch で SQS を監視して,エラー条件が満たされた場合に SNS に通知し,SNS のイベントから Lambda が起動される.ちなみに Slack に投稿するのは普通の Incoming Webhooks を使った.Incoming Webhooks の URL を AWS KMS で暗号化する手順は今回は見送ると言っていたが,個人的に KMS は気になっているので,是非次回のハンズオンで使えたら良いなと思っている.

f:id:kakku22:20160725235955p:plain

資料

今回も充実した資料が Qiita にまとまっていた.非常に参考になる.ただ今回のようにハンズオンの量が多かったりすると,遅れないようにすることに意識が変わってしまって,実際に叩いてる CLI の意味を理解せずに,惰性で進んでしまう可能性があるなと思った.少なくとも僕は途中からそうなったりもした.だからこそ「JAWS-UG 朝会」後の復習も重要!

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

学んだこと

aws cloudwatch コマンド

今までの経験上 CloudWatch の設定は全て手動で行っていて,AWS CLI から aws cloudwatch を叩いたことは無かった.ドキュメントにもある通り,アラームの設定もできるなら積極的に使っていきたいと感じた.あと少し話はズレるけど,とは言え AWS CLI で CloudWatch の設定をしていく手順を見ていると量が多くてもっと自動化したくなってくる.そうなってくると,最近部分的に採用しようかと検討している Terraform などに任せたいなと思ったりする.

www.terraform.io

動作確認

SQS 連携の部分はハンズオン中に終わらなくて,自分で復習しながら試した.うまく動いて良かった.

f:id:kakku22:20160726010454p:plain

まとめ

早起きをして一日を有効活用できる朝会最高!

来月は API Gateway + Lambda で Slack のスラッシュコマンドを作るとのこと.楽しみすぎる!絶対参加する :)

月曜朝から AWS を学べる最高の勉強会「JAWS-UG 朝会 #3」に参加してきた

今日は朝 7:30 から「JAWS-UG 朝会 #3」に参加してきた!出勤前に開催される勉強会って個人的には初だったけど,早起きできるし,スッキリした時間帯にインプットができるし,最高なのでは?という感じだった.何よりも,朝から意識が高まって,気持よく仕事モードに切り替えられたのは良かった.もっと朝勉強会が増えたら良いなと期待してる.

jawsug-asa.connpass.com

テーマ

今回のハンズオンテーマは「AWS CLI を使って SNS / Lambda を連携する BluePrint を動かす!」だった.Lambda を管理コンソールで見ると表示される "sns-message : An Amazon SNS trigger that logs the message pushed to the SNS topic." を管理コンソール無しで実装していくという感じで,簡単に図を描いてみた.

f:id:kakku22:20160620111313p:plain

資料

ハンズオン資料は全て Qiita にまとまっていて,クオリティが高かった.特に CLI を使う上で,事前確認と事後確認のためのコマンドも詳細に書かれていて,ミス無く進められるように作られている点に驚いた.

qiita.com

qiita.com

qiita.com

qiita.com

学んだことなど

add-permission

Lambda 関数から SNS にアクセスできるようにパーミッションを付与する必要がある.トピック単位ではなく SNS に対するパーミッションで良い.出社してから復習をしながら管理コンソールで動作確認をしてみたけど,該当する設定は無さそうだった.ハンズオン中にも話題になっていて,既に開発サイドにリクエストはして頂いているとのこと.

$ aws lambda add-permission \
  --function-name sns-message-20160620 \
  --statement-id AllowSNS \
  --action lambda:InvokeFunction \
  --principal sns.amazonaws.com

fileb://code.zip

CLI から ZIP をアップロードする場合 --zip-file オプションを使う.そのときにプロトコルは fileb:// とする必要がある.一瞬 typo かと思ったけど.ドキュメントにもちゃんと書いてあった.

$ ~ aws lambda create-function \
  --function-name sns-message-20160620 \
  --description 'An Amazon SNS trigger that logs the message pushed to the SNS topic.' \
  --zip-file fileb://sns-message-20160620.zip \
  --runtime python2.7 \
  --role arn:aws:iam::111:role/lambdaBasicExecution \
  --handler sns-message-20160620.lambda_handler

空振り対応

ハンズオン後の自己紹介 & 雑談の場で「Lambda の空振り対応に対する課題が残っていて,もっとクリティカルなシステムに導入した事例やベストプラクティスが出ると良いかも」という話があった.個人的に Lambda って言うと AdRoll の事例など,大規模トラフィックも既に受けている認識で,十分安定してるのかと思ってたから,なるほどなー!という感じだった.

tech.adroll.com

お掃除も CLI でやった

「管理コンソールを使って良いのは中学生まで(笑)」って話もあったし,お掃除も CLI でやった.環境変数はハンズオン資料の前提で書いている.

$ aws sns delete-topic \
  --topic-arn ${SNS_TOPIC_ARN}

$ aws lambda delete-function \
  --function-name ${LAMBDA_FUNC_NAME}

前日までに準備しておくこと

僕は今回,第3回にして初参加だったけど,全然問題無かった.ただハンズオン後の自己紹介を聞いていたら皆勤賞の人も多かったし,参加者の人に聞いたら「実は第0回もあったんですよ!」とのことで,今まで参加してなかったことを悔やむw

初参加だとしても,セットアップ的な部分に時間は割けないし,ハンズオンも比較的スピード感を持って進んでいくので,事前に最低限の準備はしておく必要があると感じた.ザッと挙げておく.ちなみに IAM に関してはハンズオン用に広めに権限を付与しておくけど,使わなくなったら消しておくこと!

まとめ

冒頭に書いた通り「JAWS-UG 朝会」最高なのでは?と感じた.次回 7/25 の募集も既に開始されているから急ぐべし!ちなみに今日は時間に余裕を持って到着したのに「アルコタワー」と「アネックス」を間違えていて,遅刻するというミスをした.正しくは目黒駅前の坂を降りて雅叙園の隣のビルだった!次回は絶対間違えないようにしないと...w

あと Lambda の話で言うと,早く Ruby ランタイムがリリースされないかなー!なんて期待している.本日はありがとうございました!

jawsug-asa.connpass.com

去年 Lambda で遊んだときに書いた記事

kakakakakku.hatenablog.com

API Gateway + Lambda で Marvel のキャラクター画像を自動返答する Slack Bot を作った

温泉ハッカソンの中で Marvelite Gem を使ったスクリプト を書いてみたんだけど,せっかくなら最近気になってた API Gateway + Lambda を試してみようと思って,Node から Marvel Comics API を叩く方向性に変えた.結果的に Marvel Comics API を使って Slack でキャラクター画像を自動返答する Bot を作った.

ParrotBot

まず,本実装に入る前に Slack + API Gateway + Lambda の疎通確認をしておきたかったので,Slack から飛んでくる Outgoing Webhooks のパラメータをパースして「オウム返し」するだけの Bot を作ってみた.ParrotBot と名付けた.

Slack の Incoming Webhooks でポストする部分は前回のエントリーに書いた通り.Outgoing Webhooks のところは後述する.

Slack で

parrotbot xxx

と書くとそのまま「オウム返し」をしてくれるようになった!

ただ Bot から o って謎のメッセージ飛んでくるのは原因不明で,温泉ハッカソンの時間も限られてたので未解決のまま.誰か教えて!

コードは playground に置いてある.

MarvelBot

次に ParrotBot をベースに Marvel のキャラクター画像を自動返答する Bot を作った.MarvelBot と名付けた.

Node から Marvel Comics API を叩くところは既に優秀なラッパーライブラリがあったので,それを使った.

Slack で

marvelbot xxx

と書くとキャラクター画像を返してくれるようになった!カッコイイ!

コードは playground に置いてある.

キャラクター画像は standard_amazing 固定だけど雑に生成した.

function(res) {
    image_path = res.data[0].thumbnail.path;
    image_extension = res.data[0].thumbnail.extension;
    image_size = 'standard_amazing'
    return image_path + '/' + image_size + '.' + image_extension;
}

学んだことなど

試行錯誤を繰り返しながら学んだことなどを簡単にまとめておこうと思う.

Lambda で出るエラー

Lambda を動かすとたまに以下のエラー出るけど,単純にシンタックスエラーが原因だったりするので,CloudWatch のログを見て直す.

{
  "errorMessage": "Process exited before completing request"
}

Lambda Blueprint

Lambda Blueprint (青写真って意味) っていうメニューが増えてて,汎用的に使える具体的なユースケースが知れて良いなぁと思った.前に Lambda を使ったときは無かったし最近の機能?

Mapping Templatesの設定

Slack の Outgoing Webhooks をトリガーにする場合,API Gateway の Integration Request で Mapping Templates に Content-Type を指定しておく必要がある.

application/x-www-form-urlencoded に対して Template に以下のコードを入力する.

$input.json('$')

Outgoing Webhooks のパラメータ

Outgoing Webhooks を使う場合,以下のようなパラメータが飛んできて Lambda の event に設定される.なので自分でパースして text の部分を取得する必要がある.

token=XXXXXXXXXXXXXXXXXX
team_id=T0001
team_domain=example
channel_id=C2147483705
channel_name=test
timestamp=1355517523.000005
user_id=U2147483697
user_name=Steve
text=googlebot: What is the air-speed velocity of an unladen swallow?
trigger_word=googlebot:

ちなみに JSON ではなくシンプルなテキストとして飛んでくる点と,半角スペースが + になっているところをケアしておく.雑に書くとこういう感じでメッセージを取得できる.

event.split('&')[9].split('=')[1].replace(/\+/g,' ');

詳しくは Slack のドキュメントを読む.

Trigger Word を絶対に設定する

Outgoing WebHooks で Trigger Word を絶対に設定するようにする.

最初 Trigger Word を設定しないで動作確認をしたら Outgoing と Incoming の会話が無限ループになって,数分で Marvel Comics API の日次アクセス上限に達してしまってワロタw

本来やりたかったこと

今回は Slack Bot を作ったけど,本来は Elasticsearch の Head Plugin でノード名のところにキャラクター画像を表示して「ノードを管理しながら Marvel も詳しくなれて一石二鳥じゃん!」っていう謎な Chrome 拡張を作りたかった!!!

まぁ今回 API まで作ったからすぐできそう.ちなみに以下のキャプチャに出てる Colleen Wing はこのキャラクターですwww

http://marvel.com/characters/2805/colleen_wing

まとめ

良かったこと

  • 温泉最高!(ハッカソンは?w)
  • ずっと気になってた API Gateway + Lambda を試せて良かった
    • 本当に EC2 無く API が作れてしまう時代なんだなと感動した
    • API Gateway も Lambda も管理コンソール上でテストできて本当に助かる
  • API Gateway 経由で Lambda を呼び出してうまく動かないときなどは Lambda のログを CloudWatch で確認できてデバッグできる

困ったこと

  • Lambda から遷移する場合とメニューから遷移する場合で API Gateway の管理コンソールの導線が違くて「あの画面どのリンクから飛ぶの!」って何回も悩んだ
  • Slack Integrations の使い方を間違えてるかも
    • Bot から o って謎のメッセージ飛んでくるし...なんで?誰か教えて!
  • Node 未経験すぎる
    • 最低限勉強しとかないとって焦ってる

関連エントリー(参考にした)

Lambda 関連のエントリー

ちょっと前だけど GW に Lambda に入門したときのエントリーも載せておく.