Edited at

API Gateway & Lambdaを利用してServerlessにJIRAチケット作成


はじめに

社内用問い合わせフォームを刷新するにあたり、今までGoogleフォームで行っていたものをAWSへ移管することにしました。

その作業の備忘録です。


システム構成図

スクリーンショット 2019-07-12 18.26.13.png


本記事のスコープ

メインはAPI GatewayLambda(Python3.7)JIRA APIの連携についてです。

S3には入力フォーム用のファイルを置き、API GatewayへPOSTでリクエストするだけなので今回の記事からは割愛します。

また、VPC・NATゲートウェイについても本記事では触れないので他の方の記事を参考にしてください。


1. Lambda Functionの作成

API Gateway作成時に指定する必要があるのでまずこちらから作成します。


1-1. ローカル環境構築

JIRAチケット作成のためにJIRAモジュールを入れる必要があります。またJIRAモジュールを入れるためにpipを使いたいのですが、Python3系にpipが無いので別途入れています。

※dockerは予めインストールお願いします

$ mkdir jira_function

$ cd jira_function
$ docker run --rm -it -v `pwd`:/lambda amazonlinux /bin/bash
# yum -y install vi zip gcc python3-devel zlib-devel libffi-devel
# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
# python3 get-pip.py
# pip install jira -t /lambda
# exit


1-2. jira_function.pyの作成

1-1で作成したjira_functionディレクトリ配下に作成します。


jira_function.py

# -*- coding: utf-8 -*

from jira import JIRA
from jira.exceptions import JIRAError
import json
import os
import requests

def jira_handler(event, context):

# get environment value
jira_options = {'server': os.environ["JIRA_URL"]}
jira_user = os.environ["JIRA_USER"]
jira_pass = os.environ["JIRA_PASS"]

# JIRA Login
try:
jira = JIRA(options=jira_options, basic_auth=(jira_user, jira_pass))
except JIRAError as e:
return { "status" : "JIRA Login Failed." }

# Create New Issue
new_issue = jira.create_issue(
project=os.environ["JIRA_PROJECT"],
summary=event['summary'], # API GatewayからJIRAチケットのタイトルをもらう
description=event['desc'], # API GatewayからJIRAチケットの詳細文をもらう
issuetype={'name':os.environ["JIRA_ISSUE_TYPE"]}
)

return { "status" : "finished" }



1-3. zipの作成

$ cd jira_function

$ zip -r ../jira_function.zip *


1-4. コンソール上で作成

サービスからAWS Lambdaを選択し、「関数の作成」をクリック

スクリーンショット 2019-07-11 18.28.40.png

関数名を適宜入力し、今回はランタイムにPython3.7を指定。右下の「関数の作成」をクリック

スクリーンショット 2019-07-11 18.33.37.png

コードエントリタイプを「.zipファイルをアップロード」を選択し、「アップロード」から1-3で作成したzipをアップロードする

スクリーンショット 2019-07-11 18.36.24.png


1-5. Lambda Functionのテスト

右上の「テスト」を押すとモーダルが立ち上がる

スクリーンショット 2019-07-11 18.44.11.png

スクリーンショット 2019-07-11 18.43.54.png

イベント名は適宜付け、コードを以下に修正する

{

"summary": "test summary",
"desc": "test desc"
}

これで準備ができたので、再度右上の「テスト」を押す

スクリーンショット 2019-07-11 18.48.01.png

無事チケットが作成されました。


2. API Gatewayの作成

先程作成したLambda FunctionをコールするAPI Gatewayを作成します。


2-1. コンソール上で作成

サービスからAPI Gatewayを選択し、「APIの作成」をクリック

スクリーンショット 2019-07-11 18.49.33.png

API名を入力して「APIの作成」をクリック

スクリーンショット 2019-07-11 19.03.46.png

「アクション」から「リソースの作成」を選択してリソース名を入力後、右下の「リソースを作成」ボタンをクリック

スクリーンショット 2019-07-11 19.07.53.png

「アクション」から「メソッドの作成」を選択してドロップダウンリストから「POST」を選択後、すぐ右のチェックボタンをクリック

スクリーンショット 2019-07-11 19.11.31.png

1で作成したLambda Functionを指定して保存をクリック

スクリーンショット 2019-07-11 19.16.11.png

権限追加のダイアログが出るのでOKをクリック

スクリーンショット 2019-07-12 11.06.18.png


2-2. API Gatewayに渡ってきたパラメータをLambdaに渡す設定

「統合リクエスト」をクリック

スクリーンショット 2019-07-12 11.08.51.png

「マッピングテンプレート」を押してContent-Typeにapplication/jsonを入力後チェックボタンをクリック

スクリーンショット 2019-07-12 11.12.16.png

コードに以下を記述する

スクリーンショット 2019-07-12 11.14.22.png

{

"summary" : "$input.params('summary')",
"desc" : "$input.params('desc')"
}


2-3. API Gateway→Lambdaのテスト

前の画面に戻り「テスト」をクリック

スクリーンショット 2019-07-12 11.17.12.png

POSTのリクエストパラメータは「クエリ文字列」欄にGETパラメータのように記述することでリクエストできます。

なのでクエリ文字列欄に以下を入力

スクリーンショット 2019-07-12 11.22.05.png

summary=test summary2&desc=test desc2

一番下の「テスト」をクリックすると

スクリーンショット 2019-07-12 11.24.32.png

無事チケットが作成されました。

あとは適当なフォームをHTMLで作成し、API GatewayのエンドポイントへPOSTすれば問い合わせフォームの完成ですがこの部分は最初にも述べた通り割愛します。