HULFT Square でAWSマイクロサービスと連携してみた

# はじめに
こんにちは。すぎもんです。😀

**AWSマイクロサービス**とは、AWSにおいて実行される小規模かつ独立したサービスのことです。

AWSマイクロサービス環境は、Amazon ECSやAWS Lambda、Amazon API GatewayなどのAWSの各種サービスを使用して構築することが可能です。異なる機能をサービス単位で個別に開発、テスト、デプロイすることができるため、柔軟性と拡張性を向上させることが可能です。

本記事ではAWSでのマイクロサービスの構築とHULFT Squareからの連携手順を紹介します。

# 今回やること
HULFT SquareからAmazon API Gatewayで作成したAWSのマイクロサービス環境の玄関口であるREST APIへ接続し、Amazon DynamoDBのレコードを取得します。
Amazon DynamoDBからのレコード取得にはAWS Lambda関数を使用します。

:::note warn 
HULFT SquareにはAWS Lamdba、Amazon DynamoDBの専用コネクタが用意されています。そのためAmazon API Gatewayを経由しなくても、「今回やること」の目的の実現は可能です。
当ブログは、**AWSマイクロサービス環境へREST API経由で外部からアクセスする方法の一例** としてご参照ください。
また、AWSマイクロサービス環境構築のパートを必要に応じて分割してご参照頂ければ幸いです。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/219e51ce-0faf-deb9-b6c3-61b682d9d020.png)



# 検証手順
## AWSマイクロサービス環境構築
### 1.Amazon DynamoDB構築
まずAmazon DynamoDB（以下、DynamoDB）で検証用データを格納するテーブルを作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7513f222-e420-fddf-d974-9aeeae6b6dc9.png)


AWSマネジメントコンソールより、**[DynamoDB]**　画面へ遷移し、**「テーブルの作成]**　をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b5e8b836-054d-6ffa-2a50-7cc378ac5abe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ab20d43e-271b-b6d6-c29d-f5d0d26c5d93.png)

今回は「users」というユーザ情報を管理するテーブルを作成します。
**[テーブル名]** に任意のテーブル名、今回は`users`と入力し **[パーティションキー]** にプライマリーキーとなる項目、今回はユーザIDを意味する`id`を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1006570c-6d67-154a-ac93-96c3baa44bfc.png)
**[デフォルトテーブル設定]** は今回変更せず、画面下部へスクロールし**テーブルの作成**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8b109d9c-f7ab-a027-725c-ed9d70635270.png)

10秒ほどでテーブルが作成されます。**[テーブル]**　画面でテーブル名`users`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/245ac7c5-b9d7-7874-50bd-f7ebe5308aa0.png)

**[テーブルアイテムの探索]**　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e95e17b7-2237-2eef-21eb-2f3461600835.png)

テーブルに検証用のデータを格納します。**[項目を作成]**　をクリックします。
属性名　**[id-パーティションキー]**　に任意の値、今回は`001`を入力し、項目の属性を追加するため **[新しい属性 の追加]**　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8f3bc95f-2f8f-2f74-c27d-1e3eb145b586.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8eee61e0-4457-c35e-aa0e-ddb38802fe52.png)

必要なデータの属性と値を入力します。今回は下記のように入力後、右下の **[項目を作成]** をクリックします。

| 属性名 |タイプ|値 | 説明 |
|:-|:-|:-|:-
| name|文字列型|root |ユーザ名
|mail|文字列型|root@example.com |メールアドレス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f446a923-11c9-2f45-e09e-7b5fdaef9490.png)



テーブルに検証用のデータを追加します。**[項目を作成]**　をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/5ae3cacd-0e3a-469d-4b54-4d72a49636db.png)

属性名　**[id-パーティションキー]**　に任意の値、今回は`002`を入力し、項目の属性を追加するため **[新しい属性 の追加]**　をクリックし、今回は下記のように入力後、右下の **[項目を作成]** をクリックします。
| 属性名 |タイプ|値 | 説明 |
|:-|:-|:-|:-
| id- パーティションキー|文字列型|002 |ユーザID
| name|文字列型|admin |ユーザ名
|mail|文字列型|admin@example.com |メールアドレス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/86eeebaa-ac12-62f0-bff0-1bfafca80333.png)


 **[項目を作成]** をクリック後、**[テーブルアイテムの探索]**　画面で入力した項目が表示されればデータの準備は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/25175f81-835d-cd1b-95b8-30c7d9308c8e.png)


### 2.IAMロール作成
次に作成したAWS Lambda関数にDynamoDBへアクセスする権限を付与するためIAMロールを新規作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6e4b399b-bf47-ba31-b5a9-816c3f7985cb.png)

AWSマネジメントコンソールより、**[IAM]**　画面 へ遷移し 画面左の　**[ロール]** をクリック後　**[ロールを作成]** クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/3f040c1d-bf26-c18b-9cd3-c6880f877b80.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/28acdacf-4b81-e37b-7a43-c536b0cedcfd.png)

信頼されたエンティティタイプは **[AWSのサービス]** 、ユースケースは **[Lambda]** を選択し、**[次へ]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/cc54c46c-46ac-5c66-2096-36cf576b0d67.png)

ロールに追加する許可ポリシーを選択します。
以下の今回は以下の2つの許可ポリシーを選択し、**[次へ]** をクリックします。


:::note info 
**[AWSLambdaBasicExecutionRole]**
Lambda関数を実行するための許可ポリシー、CloudWatchへログ出力するためにも必要です。
**[AmazonDynamoDBFullAccess]**
DynamoDBへフルアクセスする許可ポリシー
::: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/aaf1cf68-f38b-cb16-fee1-c21b71735caf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ee8ff3b3-5e93-74d6-b5d1-e8961f623eb6.png)

　**[ロール名]**　に任意の値、今回は`users-role`を入力し、**[ロールを作成]**　をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b9d8181f-e365-37d0-1207-1c1344536f74.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ca5fae35-353f-27c2-6db2-65afa1c181fb.png)

数秒でロールが作成されます。今回作成した`users-role`が **[ロール]** 画面より確認できればIAMロール作成は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/176b472d-7d04-e2dc-bdac-070870188bcb.png)

### 3.AWS Lambda関数作成
DynamoDBからレコードを取得するLambda関数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a0121695-903c-a7e5-e7f7-aa5b81fa6912.png)



AWSマネジメントコンソールより、**[Lambda]**　画面 へ遷移し **[関数の作成]** クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0d01013a-656b-c6b1-07a9-ab644c03bab0.png)

**[関数の作成]**　画面 へ遷移し 以下の項目を入力後、**[関数の作成]** クリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4a707b7a-3b74-11f5-e953-e01b258aec69.png)
**[一から作成]**　を選択
**[関数名]**　任意の関数名　今回は`users-get`と入力
**[ランタイム]**　実行プログラムの言語とバージョンを選択　今回は`Python 3.9`を選択
**[実行ロール]** `既存 のロールを使用する`を  選択
**[既存のロール]**　今回作成した`users-role`を選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/9a1ba337-0f32-7c5d-49e1-446567bc2dec.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/75963ae8-b09a-b889-e610-2946b1531d66.png)

数秒でLambda関数が作成されます。**[テスト]** タブより **[新しいイベントを作成]** を選択しイベント名、今回は`testusers`と入力後 **[テスト]**　をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d1932a75-da16-5082-7576-b18cf76ecdb9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/728e3352-8399-55e8-57fe-3df63273ae43.png)

画面上で成功を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6d61e43f-baad-b545-7456-569feb7c4f25.png)

次に関数で実行する内容のコードを **[コード]** 画面で下記のように貼り付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/dc6d3df8-a77b-ad43-b63a-85aa34422b55.png)


:::note info 
`users`テーブルから全ての情報を取得するという処理内容です。
::: 

```users-get-function.py
import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('users')

#ユーザ情報を返す
def get_users():
    response = table.scan()
    return response['Items']

users = get_users()

def lambda_handler(event, context):
    return get_users()

print(users)

```

**[Deploy]**　をクリックし、コードを適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1d9ffaec-3add-967e-1e75-428f65203e2f.png)


### 4.Amazon API Gateway設定
Amazon API Gateway（以下、API Gateway）でAWSのマイクロサービス環境の玄関口であるREST APIを作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a8359510-cea8-a62a-e27a-254c06247327.png)


AWSマネジメントコンソールより、**[API Gateway]**　画面へ遷移し、**「API作成]**　をクリックします。

:::note info
今回はWebブラウザから認証なしでアクセスできるREST APIを作成していきます。
作成した後に認証機構を組み込むには、APIキーを付与することで実現可能です。
実装方法は下記公式リファレンスをご参照下さい。
[API Gateway コンソールを使用して API キーをセットアップする](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-setup-api-key-with-console.html)

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/68155cfa-9646-95a2-f8ba-670f0b36a20b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8e9bf291-f842-3ca6-bfbb-7bfd99f1c854.png)

**[API タイプを選択]**　画面で **[REST API]** の **[構築]** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8adeff0e-b4d1-1139-4997-cc1391fa0987.png)

**[REST APIを作成]**　画面 へ遷移し 以下の項目を入力後、**[APIを作成]** クリックします。

**[新しいAPI]**　を選択
**[API名]**　任意の関数名　今回は`users-api`と入力
**[APIエンドポイントタイプ]**　今回はリージョンが適用範囲となる`リージョン`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d9006f6c-2489-aa55-740c-4c7ad20d65b2.png)

次にAPIに紐づくリソースを作成します。**[リソースを作成]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/da955abe-c623-62b0-9101-76f79c10fee1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a3413fbb-f5c0-a573-60c0-f80364bb437d.png)

数秒後にリソースの作成が完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/103caa9d-8215-9075-bc59-00f0013cc282.png)

引き続いてリソースの操作を実施するHTTPメソッドを作成していきます。**[メソッドを作成]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/795def5e-8e6b-ee61-8429-661a7352eb0c.png)
**[メソッドの詳細]**　画面 へ遷移し 以下の項目を入力後、**[メソッドを作成]** クリックします。

**[メソッドタイプ]**　今回はレコードの取得が目的のため、出力を結果を返すメソッドタイプ`GET`を選択
**[統合タイプ]**　Lambda関数を実行するため、`Lambda関数`を選択
**[Lambda関数]**　作成した`users-get`を選択して入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f36eea4a-b689-205e-ba79-b11e81e4b346.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4fb1105c-24f9-9d4e-1534-8d0e1a421f51.png)

メソッド作成完了後、**[APIをデプロイ]** クリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/36508262-36eb-a61a-73aa-3aa2534a678b.png)
**[Deploy API]**　画面 へ遷移し 以下の項目を入力後、**[デプロイ]** クリックします。

**[ステージ]**　`新しいステージ`を選択
**[ステージ名]**　任意の名称、今回は`test`を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1815a999-1f16-a131-070d-f2884f10e251.png)

**[ステージ]**　画面で　URL、`HTTP:*****/ステージ名/API名`のアドレスが作成されたことが確認できます。
URLをブラウザに張り付けて、DynamoDBに登録したデータが取得できれば、REST APIの作成は完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7da7d368-c04e-a186-0999-c663a19ea8c8.png)

:::note warn
URLは 後述する**HULFT Square設定 1.コネクション作成** の箇所でも使用します。 　
:::
## HULFT Square設定

ここからはHULFT SquareからAWSで作成したREST APIへ接続する設定を実施していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/457bddd5-27ee-a5fb-ca8c-620ca5e8a34f.png)

:::note info 
今回使用しているワークスペースは`personal`です。以下の記述ではワークスペースの記載は省略します。
::: 

### 1.コネクション作成
AWSで作成したREST APIへ接続するためにREST接続のコネクションを新規作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f6e38b39-2ae0-6220-3854-95eb6431dc2e.png)

**[名前]**　任意の名前、今回は`REST_AWSUSERS`を入力して**[次へ]**をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ed9f7427-c90e-6e5f-aeb6-aa91d04a3758.png)

**[URL]**　にはAmazon API Gateway設定のステージで作成したURLを貼り付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/884df256-0667-a7e1-fdb8-fffc9b874c55.png)

**[接続テスト]**　の成功を確認後、**[完了]** をクリックし、コネクション作成は終了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/66b2d5a6-b16a-abd7-5ad1-74b16811db0d.png)

### 2.スキーマ作成
REST APIのレスポンス用スキーマを新規作成します。

**[名前]**　任意の名前、今回は`DynamoDB_USERS`を入力
**[JSON定義]**　出力構造体のJSON定義を入力します。今回は下記に準備した`testusers.json`の内容をコピー


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/c86225c2-e0c0-5989-162d-6e4cf514688a.png)

```testusers.json
[
    {
        "mail": "root@example.com",
        "id": "001",
        "name": "root"
    }
]

```

入力内容を確認し、**[完了]** をクリックすると、スキーマ作成は終了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/3533410b-0ffb-190e-af87-7cf6c252e54c.png)




### 3.スクリプト作成
デプロイ単位であるプロジェクトを新規作成し、配下に実行用のスクリプトを作成していきます。
以下の項目を入力後、**[次へ]** クリックします。

**[名前]**　任意の名前、今回は`test_awsapi`を入力
**[スクリプトを作成]**　にチェックを入れる
**[スクリプト名]**　任意の名前、今回は`USERSGET`を入力


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2d8aaa07-f8bc-e22e-49e4-5905966917c1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/5d096d49-b1aa-c088-ea54-96bc13534796.png)

**[デザイナを起動]**　をクリックし、**[HULFT Square Designer]** を起動し、スクリプトを実行していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ac830537-6fa8-0577-c05e-e980b10022b8.png)

1．REST接続用アイコンの配置

**[ツールパレット]**　より　**[ネットワーク＞REST＞GET実行]**　アイコンを選択しドラッグ＆ドロップしてスクリプトキャンバスへ配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/52c3b9f4-3a14-6168-1f01-d17556a9c329.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0e7759ef-8f9a-e8da-1bff-e228911ee49d.png)

以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4ff4394d-6dfa-363e-34b1-0dce075ada62.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ffb07945-bb34-6e40-ad85-ee442b495c5a.png)

:::note info 
出力スキーマで指定するJSONファイルはあらかじめ　**[ストレージ]**　へ登録してあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8de0a32a-5b02-0006-6f29-7cd208a2dcef.png)
::: 

2．XMLファイル書き込みアイコンの配置
今回の検証では処理結果を確認するためにREST接続にてJSONで返却されるレスポンスをXMLファイルへ書き込みます。
**[ツールパレット]**　より　**[ファイル＞XML＞XMLファイル書き込み]**　アイコンを選択しドラッグ＆ドロップしてスクリプトキャンバスへ配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f2763b28-36c2-caea-8a64-e83e8ad33b24.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/535563c8-bd49-fb3e-717e-f877cf1509f4.png)

3．マッピングアイコンの配置
GET実行結果とXMLファイルの書き込みを紐づける　**[マッピング]**　アイコンを配置します。
**[ツールパレット]**　より　**[変換＞基本＞マッピング]**　アイコンを選択しドラッグ＆ドロップしてスクリプトキャンバスへ配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a088a31e-5562-dc1a-721d-1e4297576f10.png)

**[マッピング]**　アイコンと配置済みの2つのアイコンを　**[プロセスフロー]**　と　**[データフロー]**　を引いて繋げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/28c8ba34-6d81-2427-3d6e-e0336c055d39.png)


**[マッピング]**　アイコンを開いて下記のようにマッピング設定を実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d491e8fd-f959-a4de-f405-cb72f201bd05.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1bcfda27-830a-3c16-2acf-0e27cf7a5b0b.png)

下記のように　**[start]**　から　**[END]**　までドラッグ＆ドロップでプロセスフローの矢印を繋ぐとスクリプトの完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8edbb107-8559-60d7-7800-abde84f45b83.png)


## 検証結果確認
### 1.スクリプト実行結果確認
作成した`USERSGET`スクリプトを実行し他結果、実行に成功したことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ea33a8f8-8d64-c5ca-4a1a-d1bea5ad0729.png)

### 2.XML出力ファイル結果確認
出力先へ設定したXMLファイルにDynamoDBのデータが書き込まれていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/eef48ac4-1018-b0b9-6a22-81c93dbf1d4c.png)


# おわりに
いかがだったでしょうか。
HULFT SquareからAmazon API Gatewayで作成したAWSのマイクロサービス環境の玄関口であるREST APIへ接続し、DynamoDBのレコードを取得することができました。

特に　HULFTSquareで専用コネクタが現時点で対応していないAmazon ECS等のサービスと連携するにはAmazon API GatewayでAWSへの各種サービスと連携することが必要です。

当ブログが、Amazon API Gateway経由でのAWSマイクロサービス環境とHULFT Squareとの連携構築の一助にもなれば幸いです。

ここまで読んでいただきありがとうございました。それでは、また！