AWS Lambdaを使ってHULFT Squareを実行してみた


# はじめに

こんにちは。すぎもんです:grinning:
以前、「[コマンドを使って外部からHULFT Squareを実行する方法](https://qiita.com/sugimon/items/beeaaa615d448848ff72)」をご紹介しました。
HULFT Squareは他のクラウド製品と合わせて活用することでサーバーを持たずに稼働させることが出来ます。

そこで今回はサーバーレスコンピューティングサービスであるAWS Lambdaを使用して、HULFT Square を実行することが出来るか試してみます。
これにより、AWSや他のサービスから任意のタイミングでHULFT Squareを実行させることが出来ます。


# 今回やること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4effa46b-f975-710d-c4c5-80375e9a1e0a.png)
今回は、AWSのLambdaを使用してHULFT Squareを実行してみたいと思います。
また、他のサーバーから任意のタイミングで動かすために、API Gatewayで実行するためのリンクを発行し実際に動かしてみたいと思います。


# 実施するのに必要な設定
**HULFT Square側の設定**
1.実行したいプログラム（スクリプト）作成
2.WebAPI公開（APIマネジメント）作成

**AWS側の設定**
3.公開されたHULFT SquareのAPIを実行するLambdaを作成
4.外部(PC)からLambdaを実行するAPI Gateway作成



# HULFT Square側の設定
### 1.実行したいプログラム（スクリプト）作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/050520af-f7ef-4199-87a5-49e54ea7656a.png)

前回使用したBoxドライブにあるファイルをAmazonS3にアップロードするスクリプトを実行します。
※前回：[➀外部からのHTTPリクエストで実行するスクリプトの作成](https://qiita.com/sugimon/items/beeaaa615d448848ff72)
・プロジェクト名　：プロジェクト
・スクリプト名　　：Cloud

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/bc16dbab-8b44-617e-a940-c91c0e5c7b27.png)

実際に扱うCSVファイルには、このようなデータが格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a41fa164-f965-641a-2a0a-863a0b9ecac0.png)

### 2.WebAPI公開（APIマネジメント）作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7a2b6d1c-564b-58cd-eace-b300c00904b2.png)

HULFT SquareのWebAPIを公開する設定も前回作成した物と同じ物を使用します。

※前回：[「➁APIプロジェクト作成」「➂APIクライアント作成」「➃REST APIジョブ作成」「➄リフレッシュトークンの取得」](https://qiita.com/sugimon/items/beeaaa615d448848ff72)
➀APIプロジェクト
　・プロジェクト　：`プロジェクト`
　・バージョン　　：※最新バージョン　
　・スクリプト　　：`Cloud`
➁APIクライアント
　・名前　：　`API_client`
➂REST APIジョブ
　・名前　　　　　：　`API_Project_Path`
  　・発行したURL　：　https://<サンプル>.com/Default/API_Project_Path
　　　　　　　　　　　※<サンプル>は実施に発行した値をいれてください
➃リフレッシュトークン

:::note info
**➀APIプロジェクト**
<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b3123bf7-1f58-e285-e3ac-332bde11a955.png">

**➁APIクライアント**
<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8e6ef35b-659a-6e6b-8f56-e43b4f8231f0.png">

**➂REST APIジョブ**
<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6edfbb5f-db38-d041-d455-a89a1a1f8290.png">

**➃リフレッシュトークン**
<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1f1230a9-e650-caba-178f-2b2d62d2513d.png">
:::


# AWS側の設定
### 3. 公開されたHULFT SquareのAPIを実行するAWS Lambdaを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/43643cab-d5b3-e122-845f-8c65b8035670.png)


**AWS Lambdaを作成するうえで下記のステップで作成していきます。**

**3‐1　IAMロール作成
3-2　AWS Lambda関数作成
　3-2-➀ Pythonのインストール
　3-2-➁ Requestsライブラリをインポート
　3-2-➂ RequestsライブラリとPythonファイルをZip圧縮
　3-2-➃ AWS Lambda関数の作成**

### 3‐1IAMロール作成
AWS Lambdaを実行するためには、IAMロールを作成し紐づける必要があります。

「IAM」を検索し「ロール」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/33bf5419-4847-680d-8cd2-769a76cbd0a9.png)

「ロールを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/75c06dea-2382-dca1-88e0-fddcdb5e4081.png)

ここから、**3つのステップ**でロールを作成していきます。


**➀ 信頼されたエンティティを選択**
ここでは下記のように設定します。
信頼されたエンティティを選択：`AWSのサービス`　を選択
ユースケース：`Lambda`　を選択
<img width="550" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2d724883-d36c-f976-5528-e54524f007df.png">

**➁ 許可を追加**
ここでは下記のように設定します。
ポリシー名：`AWSLambdaBasicExecutionRole`　を選択
　　※CloudWatchへログ出力するのに必要なポリシーです
<img width="550" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a992d53d-18c8-b002-000d-523d746482d3.png">
  
**➂ 名前、確認、および作成**
ここでは下記のように設定します。
ロール名：`iamroles`　※任意の名前で問題ございません
<img width="550" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4d97e9a2-0e96-88b3-ceeb-b4046d0966f1.png">


**IAMロール作成完了**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/cf47a5ef-1fd4-95df-4b4b-20b324354aa9.png)
※このロールをLambda関数に設定していきます。

### 3-2　AWS Lambda関数作成
今回はPythonを使って実行するので作成には下記の4つのステップが必要になります。
3-2-➀ Pythonのインストール
3-2-➁ Requestsライブラリをインポート
3-2-➂ RequestsライブラリとPythonファイルをZip圧縮
3-2-➃ AWS Lambda関数の作成

:::note info
AWS LambdaでHTTPリクエストを送るには、PythonのRequestsライブラリが必要になります。
:::
#### 3-2-➀ Pythonのインストール
[Python公式サイト](https://www.python.org/)からモジュール[インストール](https://www.python.org/ftp/python/3.12.4/python-3.12.4-amd64.exe)して必要なモジュールを取得します。
※今回は、「python-3.12.4-amd64」を使用します。


#### 3-2-➁ Requestsライブラリをインポート
Requestsライブラリをインポートするために下記のコマンドを実行します
コマンド：`pip install requests`
作成されたファイルパス：`C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python312\Lib\site-packages`

:::note warn
Requestsモジュールは、PythonでHTTPリクエストを実行可能にするライブラリです。Pythonには標準で付属していないので、「pip install requests」コマンドなどを実行して別途インストールした上でインポートする必要があります。

**Requestsライブラリをインストール**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f1d58c8b-0f71-c09a-5a20-34f891bae332.png)
:::

#### 3-2-➂ RequestsライブラリとPythonファイルをZip圧縮

次に、実行したいPythonのコードをRequestsライブラリのファイルと一緒にZip圧縮します。
今回は下記のコードを使用します。
```Python
import json
import requests
import os  # osモジュールをインポート

def lambda_handler(event, context):
    # Step 1: メールとパスワードを使ってログインAPIでアクセストークンを取得する
    email = os.environ['mail']  # 環境変数からメールを取得
    password = os.environ['pass']  # 環境変数からパスワードを取得
    url = "https://app.square.hulft.com/v1/users/login"
    payload = json.dumps({"email": email, "password": password})
    headers = {"Content-Type": "application/json"}

    response = requests.request("POST", url, headers=headers, data=payload)
    print(response.text)  # 応答内容を出力
    
    # accessTokenの取得試行
    try:
        response_data = json.loads(response.text)
        access_token_email_password = response_data["accessToken"]
    except KeyError:
        print("accessTokenが見つかりません。レスポンス: ", response.text)
        return {'statusCode': 500, 'body': json.dumps('AccessToken not found')}  # accessTokenが見つからない場合の応答

    # Step 2: リフレッシュトークンを使用して、Login APIでアクセストークンを取得する
    refresh_token = os.environ['Tokens']  # 環境変数からリフレッシュトークンを取得
    url = "https://app.square.hulft.com/v1/rest-api-token"
    payload = json.dumps({"refreshToken": refresh_token})
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {access_token_email_password}"
    }

    response = requests.request("POST", url, headers=headers, data=payload)
    access_token = json.loads(response.text)["accessToken"]

    # Step 3: 取得したアクセストークンを使ってHTTPクライアントからREST API Job Endpointを実行する
    url = os.environ['JobURL']
    headers = {"Authorization": f"Bearer {access_token}"}

    response = requests.request("GET", url, headers=headers)

    # 応答を出力する
    print(response.text)

    # Lambda関数からの応答形式
    return {
        'statusCode': 200,
        'body': json.dumps('Success')
    }
```
Pythonコードをテキストファイルに記載。
`lambda_function.py`という名前のファイル名に変更し、Requestsモジュールと同じファイルパスに格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/fff97e89-c39d-136f-e6e4-87e77406b3bb.png)

:::note info
上記ファイルをすべてZip圧縮します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/fd96e937-73c9-0188-e10c-7f17695234bb.png)
:::

#### 3-2-➃ AWS Lambda関数の作成
関数名：`AWSlambda`
ランタイム：`Python3.12`
※「既存のロールを使用する」を選択する
既存のロール：`iamroles`　(➀IAMロール作成で作成したも)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b7f03ec3-9e5d-f88c-473b-bc3d24e501bb.png)

作成されたら「アップロード元」で`zipファイル`を選択
※「3）RequestsモジュールとPythonファイルをZip圧縮」で作成したもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d1e3b1f9-e8e4-68d2-6ddc-4f35d4408aa0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/737ede91-01e1-5ff8-daaf-0e8eae594151.png)

「設定」タブから `環境変数` を選択し変数を設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0034a25b-2883-d84c-e67f-5001e07ca39d.png)
※キーの文字はサンプルコードで変数にしているので同じ値を入れるとそのまま使用可能です
| キー | 値 |
|:-|:-|
| `mail` | HULFT Squareにログインする際に使用したメールアドレス |
| `pass` | HULFT Squareにログインする際に使用したパスワード |
| `Tokens` | 「➃リフレッシュトークン」で取得したもの (2.WebAPI公開) |
| `JobURL` | 「➂REST APIジョブ」で発行したURL  (2.WebAPI公開) |

下記のように登録し`保存`を押下します
イベント名：`AWSlambda`
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/56a9734a-cfb6-fa78-cb18-13b083e3347c.png">

:::note info
テスト実行すると正常に実行出来ているみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/894759e5-41cf-f891-5a81-a4d7223637bf.png)
:::

### 4.外部(PC)からLambdaを実行するAPI Gateway作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/dac7cef2-8c1e-9335-de40-7e53665ca3a5.png)


ここからは実行するためのAPI Gatewayを作成します。
まずは、API Gatewayを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2b9079e6-cf22-aaa8-a054-6afca6abf74f.png)

「APIを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/9550b55f-5831-a9f0-e346-281331b1c910.png)

「API タイプを選択」　画面で 「REST API」 の [ 構築 ] を押下します。
<img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/51f76633-73eb-98d2-be2d-2af6859f107a.png">


「REST APIを作成」 画面 で 「新しいAPI」 を選択し今回は下記のように設定しました。

API名：`HULFT Square` ※任意の値を設定してください
APIエンドポイントタイプ：`ap-northeast-1` ※適用範囲となるリージョンを選択してください
最後に、一番下にある「APIを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ce0db64c-ad62-7e20-45ac-440407ce108d.png)

APIが作成されたら、APIに紐づくリソースを作成していきます。
「リソースを作成」 を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2d6f575e-db89-3202-0ce9-12fb78fff9eb.png)

今回は、下記のように設定しました。
リソース名：`iPaas`　※任意の値を設定してください
設定したら「リソースを作成」 を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e4c6b1ed-488a-bbdc-34ab-f67a735214fb.png)

作成されたら次に、HTTPメソッドを作成していきます。「メソッドを作成」 を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/87a8233c-9337-1ddb-72d1-96cf78cf528f.png)

下記のように設定していきます。
メソッドタイプ：`POST`　を選択
統合タイプ：`Lambda関数`　を選択
Lambda関数：`AWSlambda`　作成したLambda関数名を選択してください
登録したら画面一番下にある「メゾットを作成」を押下してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/5e8ace1b-4b68-a344-03a8-f954fe3eeff0.png)

メソッド作成完了後、「APIをデプロイ」 を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/550b9296-ffa6-566b-3347-6ee7d5a82a67.png)

Deploy API　画面で今回は下記のように設定しました。
ステージ：`新しいステージ`　を選択
ステージ名：`Job`　※任意の値を設定してください
設定したら「デプロイ」を押下します。
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/dec3883b-ae8e-5add-84b4-be7f59eae2a9.png">

「ステージ」　画面でURLが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f9078554-c2c8-befd-ce4e-ab84737f3701.png)




# 実行してみる

ここからは、発行したURLを使って実行してみたいと思います。
コマンドプロンプトを開き、下記のコマンドで実行します。
```
curl -X POST "https://<API Gatewayで発行したURLドメイン>.ap-northeast-1.amazonaws.com/Job/iPaas"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d3f88768-c1ea-ed85-151c-31732fc64701.png)

実行されたか、HULFT Squareのログを見ると、正常に実行されたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/50852c1f-fc82-fbbd-9c27-58e2064645a4.png)

AWS S3にも正常にファイルが格納されているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/3bfb4c34-d057-73b5-29a4-1fd4af2f1031.png)
実際のデータも問題ございません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/34485cd6-5d84-d600-dacb-bd70445748bb.png)


# おわりに
最後まで見て頂きありがとうございます。
AWSのサービスから任意の動作をきっかけにHULFT Squareを実行させることで、他のサービスと組み合わせて使用する際に使い方の幅が広がるのではないでしょうか

今回は、外部から実行するためのAPIgatewayのリンクを出すところまで作成したのでコマンドプロンプト以外にも任意のシステムから実行出来ます。


本記事とは反対に[HULFT SquareからAWS Lambdaを実行させたい](https://qiita.com/sugimon/items/0c8c91ec4e90083d4421)場合は過去の記事も参照ください。

このブログでは、今後も様々なTopics記事や接続検証等、皆さんの参考になるような記事を投稿していきたいと思います！
それでは、また！:raised_hand: