フロントエンドエンジニアがAWSを触る。

## その１ テーブルを作成する

・[テーブルの作成]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/5dbb25c6-8e09-14cc-53be-5329b3ff6751.png)
・[テーブル名]入力
・[パーティションキー]入力
　→本記事では、idとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/adb7a0df-430f-9863-fd13-d01e9b6e876d.png)
DynamoDBテーブル作成完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/10272438-80c9-dcee-7552-2796e9a00680.png)


## その２ IAMロール作成
・[ロールを作成]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/353ba40b-22ac-bf33-4434-8d899397131b.png)
・[AWSのサービス]
　→Lambdaのrole作成のため。
・[次へ]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/b7154486-0894-3eeb-fbe9-f24062d3528d.png)
・[Lambda]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/087fc318-3c5e-21c3-9a6d-f77ee84235af.png)
・[AWSLambdaBasicExecutionRole]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/101774ef-8e93-2ffb-57d7-0fcfbd514a2f.png)
・[AmazonDynamoDBFullAccess]選択
・[次へ]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/e6eab7be-ea23-9204-5d65-fac1f021e118.png)
・[ロール名]入力
その他はdefaultのまま。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/fa3cf8aa-1798-9dc1-7cad-c3c15855dae2.png)

ロール作成完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/5e699d61-2d39-4bcb-8241-25dcbd5386be.png)


## その３ Lambda関数の作成
・[関数の作成]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/a873805d-2f37-0fb8-a8de-f6d8368164af.png)
・[関数名]任意入力
・[ランタイム：python3.9]選択
 →本記事ではpythonで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/f4401115-d4cf-85b0-6c20-b46f4213270e.png)
・[既存のロールを使用する]選択
・[既存のロール：その２で作成したロール]選択
・画面下部の[関数の作成]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/4892c7b8-abdd-2de6-fedc-e2e586f99a9f.png)
関数の作成ができました。ここからは関数を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/ff25497e-64da-cbdf-5c55-3f99b99dbb3c.png)
コードソース欄：
```lambda_function.py
import boto3
import json

dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('data-list')

def post_users(requestJSON):
    table.put_item(Item={'id': requestJSON['id'], 'title': requestJSON['title'], 'price': requestJSON['price'], 'decribe': requestJSON['decribe']})

def lambda_handler(event, context):
    request = json.loads(event['body'])
    post_users(request)

```
・注意：Deployを忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/1de0df8f-3aee-36a6-da68-074f87e81efb.png)


## その4 APIGateway
・[RESTAPI 構築]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/a5015f0b-fbb2-d443-e8c2-605a7d824e8e.png)
・[プロトコルを選択する：REST]
・[新しいAPIの作成：新しいAPI]
・[名前と説明 API名*：任意名]
・[APIの作成]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/a42ec350-19b3-e5da-c9e0-f429f228348e.png)

### リソースの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/3549d59f-13a7-5bc1-9038-6309d56c7193.png)
作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/9801f624-7e0b-d2fa-6e92-d0ff72b04766.png)

### メソッドの作成
・[アクション]選択
・[メソッドの作成]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/29fb4846-6958-2fef-7c98-e283de0a21f8.png)
・GET等のメソッドを作成します。
・Lambda関数以外はdefault状態。
・[Lambda関数：その３で作成したLambda関数]選択
・[保存]-[OK]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/92c5186b-3cf3-9bce-dbe7-0cb6647af300.png)
・[統合リクエスト]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/2ef16ac1-8b27-967c-ee52-7ae343daa588.png)

・[マッピングテンプレート]選択
・[マッピングテンプレートの追加]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/09f09d98-4794-3df2-f861-660b4bcfa951.png)
・[マッピングテンプレート下部]下記code添付 - [保存]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/8cec21fc-e543-c7d3-1c7c-90e612207739.png)

//POST メソッドの場合
```post.
{
    "body" : "$util.escapeJavaScript($input.body)"
}
```
//GET メソッドの場合
```get.
{
    "id" : "$input.params('id')"
}

```
・[application/json]入力
・[はい、この統合を保護します]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/16ecbe90-a2fb-1e1e-bb7d-c1b927074f47.png)


## その５ Windowsのcmdで実行

```cmd.
curl -X POST -H "Content-Type: application/json" -d "{\"id\":\"01\",\"title\":\"魔王勇者\",\"price\":\"250000\",\"decribe\":\"魔王勇者の冒険\"}"  https://********************/******/*****
```
・[APIGateway]-[ステージ]URLの呼び出しのURLをコピペ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/8c0bea97-e8d4-4f78-19c5-6cb648f9944e.png)

POSTが成功しました。
※GET,PUT,DELETE,POSTいずれも上記手順で対応可能です。
※Lambda関数のcodeは実行したいAPI内容により異なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/2de3ce9f-cc78-bcbd-a9d3-f27aa1d42a15.png)



## その6 AngularアプリからPOST実行するには
・[CORSの有効化]選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/152a1c13-c3be-433b-9dd6-4b4ce006668a.png)
・[Access-Control-Allow-Origin*]に許可したいオリジンを入力。
 →一時的に試すためにCORSの有効化をしたい場合は'*'ままでもOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/2d543343-becc-0a8e-5b47-51ba83a3cbe1.png)
・[CORS を有効にして既存の CORS ヘッダーを置換]を選択

```angular.ts
//[APIGateway]-[ステージ]URLの呼び出しのURLを urlで第一引数にセットしてます。
//DynamoDBに追加したい内容をbodyにobj型で第二引数にセット。
    const body = {
      id:"02",
      title:"転スラ",
      price:4890,
      decribe:"転生物語"
    }
    return this.HTTP.post(this.url,body);

```
```http.ts
 //HTTPCLIENTで接続する方法です。
    /**
   * @POST
   * @param uri 
   */
    public post(uri:string,body:any):any{

      return this.HttpClient.post(uri,body)
      .pipe(
        catchError(this.handleError),
      );
    }
```

処理後に、AWS DynamoDBにレコード追加されてるか確認してレコード追加されてれば簡単ではあるが一連の流れはつかめたとおもいます。

## 最後に
休みの日に10時間くらいかけてAPIGatewayやLambdaの意味や役割がよくわかってない状態からここまでまとめましたため不備や誤りが生じているかもしれません。
実運用には本記事は参考にせず、一連の流れを簡単に把握する目的で閲覧ください。