Apexを使ってGoでlambdaを動かす

最近Goの勉強をしているので、lambdaもGoで動かせないかなと思ってやってみた。

##準備するもの
Go
[Apex](https://github.com/apex/apex)のインストール
AWSのアカウント
awscli

##Apexとは
<img src="https://raw.githubusercontent.com/apex/apex/master/assets/logo.png" width="450px" />
 lambdaのビルドとデプロイなどを簡単に管理をするツール。
サポートしている言語はNode.js、Java、Python、Go
公式にはサポートしてないGoが使えるのはいいですね。

どうやってるのかというと、Node.jsでGoのバイナリを実行してるっぽい。

###インストール
Mac もしくは Linuxの場合
```
% curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh
```
Windowsは直接[バイナリ](https://github.com/apex/apex/releases)をインストール

インストールが終わったらはApexのアップグレードをします。
```
% apex upgrade
```

## AWSのAPIキーの設定
`aws configure `でAPIキーを設定します。

```
% aws configure

AWS Access Key ID [None]: アクセスキーID
AWS Secret Access Key [None]: アクセスキー
Default region name [None]: ap-northeast-1　//東京リージョン
Default output format [None]:ENTER
```
###今回作ったアカウント用のIAMポリシー
テスト用なのでApex用のポリシーを適応しました。
これで最低限動きます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:Create*",
                "iam:Attach*",
                "lambda:*"
            ],
            "Resource": "*"
        }
    ]
}
```

##プロジェクト作成
適当なディレクトリにプロジェクトフォルダを作ります。

```
% mkdir apex-sample-go
% cd apex-sample-go
```

### init
プロジェクトの雛形を作ります。

```
% apex init


             _    ____  _______  __
            / \  |  _ \| ____\ \/ /
           / _ \ | |_) |  _|  \  /
          / ___ \|  __/| |___ /  \
         /_/   \_\_|   |_____/_/\_\



  Enter the name of your project. It should be machine-friendly, as this
  is used to prefix your functions in Lambda.

    Project name: apex-sample-golang //プロジェクト名の入力

  Enter an optional description of your project.

    Project description: apex-samle-golang is Hello world App by Golang //プロジェクトの説明

  [+] creating IAM apex-sample-golang_lambda_function role
  [+] creating IAM apex-sample-golang_lambda_logs policy
  [+] attaching policy to lambda_function role.
  [+] creating ./project.json
  [+] creating ./functions

  Setup complete, deploy those functions!

    $ apex deploy
```

## lambdaの作成
公式に[Goのサンプル](https://github.com/apex/apex/tree/master/_examples/go)があるのでそれを写経。`functions/hello/main.go`に保存し、自動作成されている`functions/hello/index.js`(node.jsのhello world)は削除します。ファイル構成は以下の形になります。

```
apex-sample-go/
├── event.json (サンプルから）
├── functions/
│   └── hello/
│       └── main.go （サンプルから）
└── project.json
```

できたら`apex deploy`をします。

```
% apex deploy
   • creating function         function=hello
   • created alias current     function=hello version=1
   • function created          function=hello name=apex-samle-golang_hello version=1
```

なお失敗してもエラーメッセージが出るので安心

```
% apex deploy
   ⨯ Error: function hello: build hook: can't load package: package main:
main.go:1:1: expected 'package', found 'EOF'
```
### lambda実行
`apex invoke 関数名`でlambdaを実行します。
```
% apex invoke hello < event.json
{"hello":"world"}
```
上記のように返ってきたら成功です。

## マネジメントコンソールで確認
AWSのマネジメントコンソールからlambdaを開いてみると

![Apex01.JPG](https://qiita-image-store.s3.amazonaws.com/0/43738/8a3c65e4-7935-2d40-f3b9-2b88c89cbef2.jpeg)

ちゃんと作られているのが確認できました。

ちなみにCode Sizeは `875.4KB`でした。
`apex-go`パッケージを使ってるから他の言語より大きいのかな。

##最後に
サンプルで試しただけでしたが、とても簡単にGoでlambdaを作ることが出来ました。
`apex-go`は他にも
* CloudWatch Logs
* Cognito
* Kinesis
* Dynamo
* S3
* SNS
* SES

サポートしているみたいなのでいろんなアプリを作ることが出来そうです。
でも一番は公式対応してくれるといいなと思います。

##参考
[Apexの公式ドキュメント](http://apex.run/)