AWS Toolkits for IntelliJ による Lambda 開発フローを試してみる

# はじめに

この記事は ウェブクルー Advent Calendar 2018 の23日目の記事です。
昨日は @noko_k さんの「バックエンドエンジニアが事前知識なしでReact Native(+ Expo)に入門して詰まったところ」でした。

# 概要

AWS Lambda の開発支援プラグイン AWS Toolkits for IntelliJ がプレビュー版として公開されたので、試してみました。
今回は IntelliJ IDEA Ultimate で試しましたが、PyCharm でも利用できます。

# 1. 機能概要

主に以下の機能が提供されています。

### 全般

- 新規プロジェクトのウィザード
  - サーバーレスアプリケーション用のプロジェクトを作成できます。
- 資格情報管理
  - AWS CLI で管理されている認証情報ファイル (~/.aws/credentials) を参照・編集できます。
- リソース管理
  - AWS に接続する際の Profile や Region を選択する事ができます。
  - 選択した Profile / Region で使用可能な Lambda 等の AWS リソースを一覧表示できます。  

### AWS Lambda 関連

- ローカル開発支援
  - ローカル環境で Lambda のテスト実行およびデバッグを行う事ができます。
- ビルド＆デプロイ
  - ローカル環境でビルドした Lambda を AWS へデプロイする事ができます。
- AWS 上の Lambda の実行
  - リクエスト情報を作成し、AWS 上にデプロイされている Lambda を実行できます。
- AWS 上の Lambda 設定の参照・変更
  - AWS 上にデプロイされている Lambda の設定情報を参照・変更できます。

# 2. インストール

Plugins の MarketPlace からインストールできます。
AWS Toolkit 

また、別途 AWS SAM CLI のインストールが必要です。
プラグインが提供するいくつかの機能は、バックグラウンドで AWS SAM CLI を利用しています。

AWS SAM CLI のインストール手順については、公式サイトの [Installing the AWS SAM CLI](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html) を参照してください。

# 3. プラグインを試す

プロジェクト作成、ローカル環境でテスト実行、AWSへデプロイ＆動作確認の流れで試してみました。

## 3-1. プロジェクト作成

New Project の項目に **AWS Serverless Application** が追加されています。
Runtime と Project SDK を選択して、次へ進みます。
<img width="804" alt="new-project.png" src="https://qiita-image-store.s3.amazonaws.com/0/200934/5e8f9f41-bdbc-bff7-a6f2-f9cbe394ad13.png">

次に、プロジェクトのテンプレートを選択できます。
今回は AWS SAM Hello World を選択しました。

最後にプロジェクトの保存場所を選択して、完了です。

なお、プロジェクトには依存性管理に Maven が使用されています。
プロジェクトを開いた際に Maven Project 機能の追加を促されると思うので、追加してください。

## 3-2. AWS 接続設定

画面の右下で AWS への接続設定が行えます。
接続先の Region と、利用する Profile　を選択しておきます。
![](https://qiita-image-store.s3.amazonaws.com/0/200934/673951b2-56cb-b381-7193-d982b19361f3.gif)

選択した AWS 接続設定で、AWS Explorer から AWS 上のリソースが一覧表示できます。
デフォルトだとサイドバー画面左下にあります。
<img width="360" alt="aws-explorer.png" src="https://qiita-image-store.s3.amazonaws.com/0/200934/daf410cf-45ba-5c1e-4c69-f5b93d44ffdf.png">

## 3-3. ローカル環境でテスト実行

RequestHandler を実装している所から実行できます。
<img width="495" alt="local-run-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/200934/b993c9d8-f694-aa6d-f799-e27b95a79c55.png">

実行条件を設定します。ここの Input に Lambda へのリクエスト情報を指定できます。
テンプレートからも選択可能なので、今回は「API Gateway AWS Proxy」を選択しました。
<img width="532" alt="run-config.png" src="https://qiita-image-store.s3.amazonaws.com/0/200934/fd2e2c64-ea35-504d-db57-4e110478a7d0.png">

コンソールにレスポンスが出力されます。

```
{"body":"{ \"message\": \"hello world\", \"location\": \"xxx.xxx.xxx.xxx\" }","headers":{"X-Custom-Header":"application/json","Content-Type":"application/json"},"statusCode":200}
```

ブレークポイントを設定してデバッグ実行すれば、デバッグする事も可能です。
実行条件で設定したリクエスト情報が、確かに受け取れています。
<img width="662" alt="debug.png" src="https://qiita-image-store.s3.amazonaws.com/0/200934/d25631f0-71d8-c114-0ddb-a364db453d13.png">

## 3-4. AWSへデプロイ

AWS へデプロイしてみます。

CloudFormation に Stack を作成し、それを利用したデプロイが GUI としては提供されているのですが、実際の処理を行う AWS SAM CLI の build コマンドがまだ java8 のランタイムをサポートしていないようだったので、この方法は使う事はできませんでした。

```
2018-12-15 16:34:57 Found credentials in shared credentials file: ~/.aws/credentials
2018-12-15 16:34:58 Building resource 'HelloWorldFunction'
Build Failed
Error: 'java8' runtime is not supported
```

なので、今回は直接 Lambda を作成したいと思います。
AWS Explorer の Lambda から Craete new AWS Lambda を選択します。
<img width="332" alt="create-lambda.png" src="https://qiita-image-store.s3.amazonaws.com/0/200934/23607722-b65c-7253-705b-d2522855f646.png">

設定画面で Name, Handler, Runtime, IAM, Bucket を設定して作成します。
<img width="635" alt="create-function-config.png" src="https://qiita-image-store.s3.amazonaws.com/0/200934/7d1d55d9-af85-eddf-897a-5eace3b02ca9.png">

これで作成できました。

## 3-5. AWS上で動作確認

デプロイされた Lambda を実行してみます。
AWS Explorer に表示されている Lambda を選択し実行します。
<img width="476" alt="run-remote-lambda.png" src="https://qiita-image-store.s3.amazonaws.com/0/200934/920c0f51-f8fe-2a1f-10ab-fe4797755497.png">

ローカル実行の時の同じ要領で、実行条件を設定する事ができます。
コンソールにレスポンスの内容が表示されます。

```
Invoking Lambda function: try-aws-toolkit
Logs: 
START RequestId: 79164e5e-0041-11e9-9531-21cb32e1956a Version: $LATEST
END RequestId: 79164e5e-0041-11e9-9531-21cb32e1956a
REPORT RequestId: 79164e5e-0041-11e9-9531-21cb32e1956a	Duration: 14819.37 ms	Billed Duration: 14900 ms 	Memory Size: 128 MB	Max Memory Used: 71 MB	

Output: 
{
  "body": "{ \"message\": \"hello world\", \"location\": \"xxx.xxx.xxx.xxx\" }",
  "headers": {
    "X-Custom-Header": "application/json",
    "Content-Type": "application/json"
  },
  "statusCode": 200
}
```

# 4. まとめ

CloudFormation に未対応なのは残念でしたが、AWS SAM CLI 側の対応でいずれ使えるようになると思います。それでも、ローカルテストとデプロイが簡単にでき、Lambda の設定も AWS コンソールを操作せずに行えるのは良いですね。

チーム開発では Serverless Framework などのフレームワークを使ったほうが良いと思いますが、個人用でさくっと作りたい時には便利そうです。

明日の記事は @yusuke-kobayashi0117 さんです。よろしくお願いいたします。

ウェブクルーでは一緒に働いていただける方を随時募集しております。
お気軽にエントリーくださいませ。

- [開発エンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000005)
- [フロントエンドエンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000001)