API Gateway & Lambda를 사용하여 Serverless에 JIRA 티켓 생성

소개



사내용 문의 폼을 쇄신함에 있어서, 지금까지 Google 폼으로 하고 있던 것을 AWS에 이관하기로 했습니다.
그 작업의 비망록입니다.

시스템 구성도





이 기사의 범위



메인은 API Gateway·Lambda(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를 선택하고 함수 생성을 클릭합니다.


함수명을 적당히 입력해, 이번은 런타임에 Python3.7을 지정. 오른쪽 하단의 함수 만들기를 클릭합니다.


코드 항목 유형을 '.zip 파일 업로드'를 선택하고 '업로드'에서 1-3으로 만든 zip 업로드


1-5. Lambda Function 테스트



오른쪽 상단의 "테스트"를 누르면 모달이 시작됩니다.



이벤트명은 적절히 붙이고, 코드를 이하에 수정한다
{
  "summary": "test summary",
  "desc": "test desc"
}

이제 준비가 되었으므로 다시 오른쪽 상단의 "테스트"를 누르십시오.

안전 티켓이 만들어졌습니다.

2. API Gateway 만들기



방금 만든 Lambda Function을 호출하는 API Gateway를 만듭니다.

2-1. 콘솔에서 생성



서비스에서 API Gateway를 선택하고 API 만들기를 클릭합니다.


API 이름을 입력하고 API 만들기를 클릭합니다.


액션에서 리소스 만들기를 선택하고 리소스 이름을 입력한 후 오른쪽 하단의 리소스 만들기 버튼을 클릭합니다.


"액션"에서 "메소드 만들기"를 선택하고 드롭다운 목록에서 "POST"를 선택한 후 바로 오른쪽의 체크 버튼을 클릭합니다.


1에서 만든 람다 기능을 지정하고 저장을 클릭합니다.


권한 추가 대화 상자가 표시되므로 확인을 클릭합니다.


2-2. API Gateway로 전달된 파라미터를 Lambda에 전달하는 설정



통합 요청을 클릭


"맵핑 템플릿"을 눌러 Content-Type에 application/json를 입력 한 후 확인 버튼을 클릭하십시오.


코드에 다음을 씁니다.

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

2-3. API Gateway→Lambda 테스트



이전 화면으로 돌아가서 "테스트"를 클릭하십시오.


POST 요청 매개변수는 '쿼리 문자열' 열에 GET 매개변수와 같이 작성하여 요청할 수 있습니다.
그래서 쿼리 문자열 열에 다음을 입력하십시오.

summary=test summary2&desc=test desc2

하단의 "테스트"를 클릭하면

안전 티켓이 만들어졌습니다.
그리고는 적당한 폼을 HTML로 작성해, API Gateway의 엔드 포인트에 POST하면 문의 폼의 완성입니다만 이 부분은 최초로도 말했듯이 생략합니다.

좋은 웹페이지 즐겨찾기