5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-09-11

#はじめに
社内用問い合わせフォームを刷新するにあたり、今まで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すれば問い合わせフォームの完成ですがこの部分は最初にも述べた通り割愛します。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?