弊社では開発部のコミュニケーションツールとしてSlackを導入しました。apiのスラッシュコマンドを使ってアプリを作成しました。今回はSlackのスラッシュコマンドからLambdaを通しS3にアクセスする方法について書きたいと思います。最低限動くことを目的に書いていますので、セキュリティ等の考慮はしていませんので、ご了承ください。Lambda関数の作成まずは、Lambdaの関数を作成していきます。「関数名」は任意の名前ですので、今回は「SlackApi」にしました。8.10」を選択しました。「実行ロール」には「LambdaFullAccess」のポリシーのみをアタッチしたロールを割り当てています。(Lambdaの実行とS3への書き込み権限があれば大丈夫です。なければ、IAMから作成してください。Gatewayの設定をしていきます。「Protocol」は「REST」を選択、「新しいAPI」を選択し、「API名」に任意の名前を入力します。今回はLambda関数と同じ「SlackApi」にしました。作成した後、「アクション」から「メソッドの作成」で「POST」を選択します。セットアップは基本的にデフォルトで問題ないと思います。「Lambda関数」には先ほど作成した「SlackApi」を選択します。Gateway」に、Lambda関数を呼び出す権限を与えても良いか聞かれるのでOKを押します。Gatewayは作成できました。次に、「統合リクエスト」から「マッピングテンプレート」を設定していきます。apiから送られてくるリクエストのContent-Typeはapplication/x-www-form-urlencodedです。GatewayからLambdaへ渡すことができません。そのため、この形式を受け取れるように設定してあげる必要があります。「テンプレートの生成」から「メソッドリクエストのパススルー」を選択すると下記のように記述されます。設定ができたら保存してください。APIのデプロイを選択。「デプロイされるステージ」に「新しいステージ」を選択し、ステージ名に任意の名前を入力し、「デプロイ」します。デプロイが完了するとエンドポイントURLが表示されるかと思います。apiで使っていきます。Building」をクリック。Workspace」に「自身のワークスペース」を選択してください。Command」をクリックします。「Command」には任意のスラッシュコマンドを記載してください。今回は「/lambda」にしました。Gatewayで表示されたURLを指定してください。Description」には「スラッシュコマンドの説明」を記載してください。その他のフォームはオプションですので、どちらでも大丈夫です。App」から自身のワークスペースにインストールして下さい。これで、スラッシュコマンドを入力すると簡単なレスポンスを返す処理ができました。Lambda!\""}というレスポンスが返ってくるかと思います。これだけではあまり役立たないでしょう。そこで、LambdaからS3を操作する処理を加えていきたいと思います。apiの仕様として、3秒以内にSlackへレスポンスを返さないとタイムアウトになってしまいます。そのため、「S3を呼び出す処理」と「Slackへレスポンスを返す処理」を非同期に呼び出す必要があります。Lambdaにはinvoke()という別のLambdaを同期・非同期で呼び出すことができるメソッドがありますので、今回はこちらを使用していきたいと思います。Lambdaはインラインで編集もできますが、今回はnpmでモジュールをインストールして使用していますので、ローカルで編集してzipでアップロードする方法を取りたいと思います。aws-sdkを実行し、AWSの関数を実行するためのモジュールをインストールします。commandから呼び出すLambdaを作成します。(最初に作った関数です。)index.jsというファイルを作成し、以下を記載します。});};lambdaのinvoke()関数では、第1引数にオプション、第2引数にコールバック関数を渡します。今回はオプションで2つのデータを渡しています。FunctionNameでは、呼び出すLambdaの関数を指定しています。InvocationTypeでは、呼び出すLambda関数を同期処理で呼ぶか非同期処理で呼ぶかを指定します。デフォルトでは同期処理になっています。こちらにEventを指定することで、非同期に呼び出すことができるようになります。コールバック関数内では、次の処理を行っています。context.failは失敗時にレスポンスを返すメソッドで、context.succeedは成功時にレスポンスを返すメソッドです。ここのレスポンスがSlackへ送信されます。処理が書けたら、index.jsとnode_modulesをzip化し、SlackApiという名前のLambda関数にアップロードします。uploadToS3次に、SlackApi関数から呼ぶLambda関数を作成します。今回は、uploadToS3という名前で作成しました。その他の設定項目はSlackApiと同様で問題ありません。こちらもローカルで作成していきますが、ファイル名は同じindex.jsで作成していきたいので、別のディレクトリ内に作った方が良いでしょう。index.jsというファイルに、以下を記載します。console.log('エラーが発生しました。});};こちらでは、SlackApi関数から呼ばれてS3にファイルをアップロードしています。アクセスキーの作成」から作成してください。今回アクセスキーはLambdaの環境変数に指定しています。process.env['キー名']とすることで環境変数の値を取得することができます。このindex.jsと先ほどアップロードしたものと同じnode_modulesをzip化しアップロードします。念の為、Lambda上でテストを実行しておきましょう。S3にアップロードする用にバケットを作成しておきましょう。先のソースコードではfromslackapiという名前を指定していましたので、こちらで作成していきます。オプションは基本的に何でも問題ありません。「SlackApi」関数の「テストイベントの設定」から新しいテストイベントを作成していきます。イベント名に「SlackApi」と入力し、作成を押します。Success!"」というレスポンスが返ってきているかと思います。動作確認では、実際にSlackからコマンドを実行してみましょう。Success!」と返信が返ってきます。S3にもちゃんとアップロードされていますね。まとめこのようにLambdaを使えば簡単にSlackからアプリを実行させることができます。今回は、S3にファイルを置くという単純な処理を書きましたが、実務でも使えるものもたくさんあるかと思います。この記事が何かの役立てば幸いです。CINC開発部のTです。基本的な使い方Core開発部Kです。S3に溜め込んでいるデータを集計して扱おうと...2018-10-18新人が2ヶ月で新機能をリリースしました開発部のFです。弊社では10月にKeywordmapの新機能である「ア...2018-07-23プログラミング未経験だった私が、エンジニアとして働いた1年間を振り返る開発部の瀧です。私事ではありますが、弊社株式会社Coreに入社...2018-07-22Nginx+PHPとNginx+Goの単純な処理性能差を確認してみたCore開発部の加藤です。»プロフィール株式会社CINCのエンジニアチームです。日々マーケティングツールの開発やR&Dを行っています。月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。