AWS Lambdaデプロイ方法を求めて： Codeship

このドキュメントレベル：初めて学ぶ人向け

Lambdaの良いデプロイフローはないかと思って調べた記録です。
Lambdaのデプロイにはいくつか種類があるようです。

Serveless
Apex
Lamvery
LambCI
CodeShip

前回は「Serveless」[AWS Lambdaデプロイ方法を求めて：Serverlessフレームワーク \- Qiita](http://qiita.com/bohebohechan/items/fdf6815b1203f67fd2b7)について調べましたが、
今回は「CodeShip」について、どんなものかを触りだけ調べています。

# Codeship

stackshareのDevOpsでなかなか人気もののようです

![Codeship](https://qiita-image-store.s3.amazonaws.com/0/32215/5aad15d5-9da6-c389-1bae-98e13d4d2ef2.png)


無料枠で使いましょう。

![スクリーンショット 2017-05-11 7.16.13.png](https://qiita-image-store.s3.amazonaws.com/0/32215/70f9fd4d-f007-c12d-0140-98896e725173.png)


## ■ 注意しないといけない点

**Codeshipでは Lambda関数を事前に作っておかなくてはいけません！**
あと、エイリアス「PROD」も作っておかないと、後半のデプロイで失敗してしまいます。

## ■ AWSコンソールで、lambda関数を作成

ここで、コミットするハンドラー名称と関数名と合わせておくようにしましょう

![lambda関数](https://qiita-image-store.s3.amazonaws.com/0/32215/684e6ac8-2748-d8fb-0918-12545f8b2c86.png)


- sample-lambda関数
- handler.jsのhelloを呼び出します、なのでハンドラ名は「handler.hello」にします
- エイリアス「PROD」を作成
- テスト実行

```js

use strict';

module.exports.hello = (event, context, callback) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Good Good Morning CodeShip!!Your function executed successfully!',
      input: event,
    }),
  };

  callback(null, response);

};
```

## ■ Codeshipにサインアップでプロジェクトを作成します

プロジェクトタイプはBasicを選択

![プロジェクトタイプの洗濯](https://qiita-image-store.s3.amazonaws.com/0/32215/24c160cc-6835-aa38-bbbe-b2640954444a.png)

今回はGitHubと連携してデプロイします
**GitLabとも連携できますね！**

![GitHub連携](https://qiita-image-store.s3.amazonaws.com/0/32215/3fa02673-6b2b-b2c4-8bdf-cdd7addfa1f7.png)

テストのパイプラインも設定できます。 
今回は、「npm test」だけ実行します 
 
なので、「package.json」側にとりあえず通るダミーを設定しています。

![テストパイプライン](https://qiita-image-store.s3.amazonaws.com/0/32215/e584e7c8-69a4-8442-a591-71510711b6ee.png)

package.json

```json

{
  "name": "sample-lambda",
  "version": "1.0.0",
  "description": "",
  "main": "handler.js",
  "scripts": {
    "test": "echo \"OK\" && exit 0" ★無理やりテスト通していますw
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/bohebohe/sample-lambda.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/bohebohe/sample-lambda/issues"
  },
  "homepage": "https://github.com/bohebohe/sample-lambda#readme"
}
```



gitHubのsample-lambdaリポジトリのマスターと連携します

![gitHubのマスターと連携します](https://qiita-image-store.s3.amazonaws.com/0/32215/abca4a83-69cb-006a-bfb6-31cde0018c4b.png)
 
連携するgitHub 
今回はserverless.ymlは不要です・・・。前回の実験の名残です。  
 
![連携するgitHub](https://qiita-image-store.s3.amazonaws.com/0/32215/7b508369-8ca7-97d9-7286-17f4ffe919f7.png)
 
準備できました！
 
![sample-lambda](https://qiita-image-store.s3.amazonaws.com/0/32215/b09f1fcc-81fc-be95-4013-dff98b7b2e9d.png)


## ■ Codeshipでのデプロイ設定
 
デプロイできるIAMユーザーを作成します。 
そのユーザーに対して、以下のポリシーをアタッチしてください。 
**ARNの部分を書き換えてください** 
 
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:UpdateFunctionCode",
                "lambda:UpdateFunctionConfiguration",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:PublishVersion",
                "lambda:UpdateAlias"
            ],
            "Resource": [
                "arn:aws:lambda:YOUR_AWS_REGION:YOUR_AWS_ACCOUNT_ID:function:YOUR_FUNCTION_NAME"
            ]
        }
    ]
}
```


作成したユーザーのAWSのアクセスキーをCodeShipの環境変数に設定します

![CodeShipの環境変数](https://qiita-image-store.s3.amazonaws.com/0/32215/298aa7d0-894d-8552-144a-f0e9d04c3868.png)


デプロイのためのCustomScriptを書きます

![CustomScript](https://qiita-image-store.s3.amazonaws.com/0/32215/cecd23be-264d-d7da-1dfb-092bad327517.png)



![CustomScript](https://qiita-image-store.s3.amazonaws.com/0/32215/8549db78-828c-674c-c4e6-205118c28c6d.png)


## ■ gitHubにpush

gitHubのpushをトリガーにして、テストが実行され、OKであればデプロイされて、結果が表示されます。

![ダッシュボード](https://qiita-image-store.s3.amazonaws.com/0/32215/e3b0253a-58c8-1597-43ab-1d254cf54bdd.png)



# 感想

お手軽感はありますね。ただ、事前にlambda関数を作成したりと一手間かかるので、全てyamlでというserverless方式とはちょっと違います。
コードを苦手な人向け？なのかな。


# 参考サイト

- [Deploy to AWS Lambda](https://documentation.codeship.com/basic/continuous-deployment/deployment-to-aws-lambda/)
- [Integrating AWS Lambda with Codeship \- via @codeship \| via @codeship](https://blog.codeship.com/integrating-aws-lambda-with-codeship/)