Windows10にてAWS 開発環境整備を整備する(Terraform,Terraformer,ServerlessFramework)

## 始めに
- AWSの開発を少しずつ行っていますが、やはりIaC(Infrastructure as Code)で開発を行っていきたいと考えました。
- その中で`terraform`や`ServerlessFlamework`などのツールを利用することにし、その環境構築をメモします。

## 動作環境
- OS
  - Windows10 pro
- 利用するツール
  - [chocolatey](https://chocolatey.org/) : Windows用のパッケージマネージャ。各種ツールのインストールに利用
  - [git](https://git-scm.com/) : 言わずもがな。terraformerのダウンロードに利用。
  - [AWS CLI](https://aws.amazon.com/jp/cli/) : AWS 操作用のCLI

## 整備する開発環境

| 環境 | 公式ページ | 概要 |
|:-----------------:|:------------------:|:------------------:|
| **node.js** | https://nodejs.org/ja/ | ServerlessFramework にて利用|
| **ServerlessFramework** | https://serverless.com/ | Lambdaのローカルでのデバッグやデプロイを行う |
| **terraform** | https://www.terraform.io/ | AWS環境をコード管理する |
| **terraformer** | https://github.com/GoogleCloudPlatform/terraformer　| 既存環境からterraformファイルを生成する |

## やること
- terraformerで既存環境のIAMのterraformファイルを抽出する
- [(terraform・・・前回ある程度やったので割愛)](https://qiita.com/garakutayama/items/0cdf43816bde2378f4f9)
- Serverless Frameworkでlambdaをデプロイする


## 開発環境

### AWS CLIのインストール

基本的には[公式ガイド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-windows.html#install-msi-on-windows)を参考に実施します。

#### 初期設定

初回

```powershell
PS > aws configure

AWS Access Key ID [None]: YOUR_ACCESS_KEY_ID
AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY
Default region name [None]: ap-northeast-1
Default output format [None]: text
```

- プロファイルIDを指定して作成 

```powershell
PS > aws configure --profile <YOUR_PROFIlE_ID>

AWS Access Key ID [None]: <YOUR_ACCESS_KEY>
AWS Secret Access Key [None]: <YOUR_SECRET_ACCESS_KEY>
Default region name [None]: <YOUR_REGION>
Default output format [None]:
```

### terraformをインストール

```powershell
# chocolateyにてterraformをインストールする
choco install terraform -y
```

こんな感じで認識すればOK

```powershell
PS > terraform -v

Terraform v0.12.12
```

### terraformerをインストール

公式ページを参考に実施していきます

https://serverless.com/framework/docs/providers/aws/guide/credentials/#setup-with-the-aws-cli

ただし私は[インストール手順の2,3](https://github.com/GoogleCloudPlatform/terraformer#installation)が**うまく動作しませんでした。**　**あくまで動いただけですので注意ください**

---
2020/11/05 追記

>ただし私はインストール手順の2,3がうまく動作しませんでした。

上記の件、下記リンクのようにGoをインストールするといけるようです。
@MarvelWorksJp さん、情報ありがとうございました。

参考URL
https://qiita.com/yoskeoka/items/0dcc62a07bf5eb48dc4b

---


```powershell
# terraformerをクローンするローカルディレクトリに移動
cd <YOUR_DIRECTORY>

# gitからクローンする
git clone https://github.com/GoogleCloudPlatform/terraformer.git

# システム環境変数にterraformerのディレクトリパスを設定
# !! システム環境変数の設定は十分注意してください !!
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";<YOUR_DIRECTORY>\terraformer", [EnvironmentVariableTarget]::Machine)
```

こんな感じで認識すればOK

```powershell
PS > terraformer --version

version v0.8.4
```

### Serverless Frameworkをインストール

https://serverlesspolska.pl/2019/01/05/Jak-zainstalowac-Serverless-Framework/

```powershell
npm install -g serverless
```

こんな感じで認識すればOK

```powershell
PS > serverless -v

Framework Core: 1.55.1
Plugin: 3.2.0
SDK: 2.1.2
Components Core: 1.1.2
Components CLI: 1.4.0
```

## 実際に使ってみる

AWS に対して、`Terraformer`、`Terraform`、`serverless framework`をお試ししてみます

### Terraformer

- 今回はaws cliにて設定したプロファイル`<YOUR_PROFIlE_ID>`のIAM情報を抜き出してみます

- 詳しい使い方は以下参照

https://github.com/GoogleCloudPlatform/terraformer#use-with-aws

```powershell
# terraformファイルを管理する任意のディレクトリに移動
cd <YOUR_TERRAFORM_DIRECTORY>

# AWSをプロバイダ設定したinit.tfファイルを新規生成
echo 'provider "aws" {}' | Set-Content "init.tf" -Encoding utf8

# terraformの初期化
terraform init

# terraformerにてインポートを実行
terraformer import aws --resources=iam --regions=ap-northeast-1 --profile=<YOUR_PROFIlE_ID>
```

- 下記のようにgeneratedフォルダ配下に出力したterraformファイルができていればOK

```powershell
PS > tree

Folder PATH listing
Volume serial number is 1A12-01D8
C:.
├───.terraform
│   └───plugins
│       └───windows_amd64
└───generated
    └───aws
        └───iam
```

### ServerlessFramework

#### ローカルに環境を作成する

```powershell
# ServerlessFrameworkファイルを管理する任意のディレクトリに移動
cd <YOURE_SERVERLESS_DIRECTORY>

# ServerlessFramework環境の作成
serverless create --template aws-python3 --path lambda-test
```

- 下記のようにプロジェクトフォルダが生成される

```powershell
PS > tree /f

Folder PATH listing
Volume serial number is 1A12-01D8
C:.
└───lambda-test
        .gitignore
        handler.py
        serverless.yml
```

#### デプロイする
-　下記の公式ページを参考に `serverless.yml`を対象のAWS環境に合わせて任意の内容に変更します。

https://serverless.com/framework/docs/providers/aws/guide

```yaml:serverless.yml

service: lambda-test

provider:
  name: aws
  runtime: python3.7
+  region: ap-northeast-1 # 追加 
+  profile: default # 追加 
+  role: <YOUR_ROLE> # 追加 ・・・今回は既存のroleを利用しましたが、新規作成の場合はresourcesにて作成してください

functions:
  hello:
    handler: handler.hello
```

ちなみに`handler.py`は今回編集してませんが、こんな感じになっています

```python:handler.py
import json


def hello(event, context):
    body = {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "input": event
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    return response

    # Use this code if you don't use the http event with the LAMBDA-PROXY
    # integration
    """
    return {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "event": event
    }
    """
```

- デプロイを実行します

```powershell
# 作成された`lambda-testディレクトリに移動
cd .\lambda-test

# デプロイを実行
serverless deploy -v
```

こんな感じになればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398359/aad61cda-d716-3d18-7e6c-ee110473987f.png)

## 最後に
- 今回`terraformer`を利用できるようになったことで、**すでに構築した環境のterraform化やAWSの環境構築をコンソールをポチポチと手探りでしたのちに作成することができるようになりました**ので活用していきたいと思います。
- また`ServerlessFramework`によって**Lambdaの開発も効率化**できそうですのでいろいろ使ったみたいと思います