プログラミング不要! Codeship で GitHub と Lambda をつなぐ

2016.02.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Demo_Codeship

こんにちは、ももんが大好きの小山です。

突然ですが、CodePipeline の Lambda 非対応について疑問をもったことはありませんか? 複数のメンバーで Lambda 関数を開発しようと思ったとき、バージョニングとエイリアスでは不足が生じるかもしれません。慣れ親しんだ GitHub から、もっとシームレスにデプロイできたらいいのに... そんな願いをかなえてくれるのが、きょうご紹介する Codeship です。以下の内容は1行たりともコードが書けない小山が書いていますから、怖がらずにぜひ試してみてください!

サインアップとプロジェクトの作成

幸い Codeship には無償プランがありますから、公式サイトからサインアップします。サインインしたら、Let's do it! を押して進みましょう。
Codeship1

今回は GitHub レポジトリでコミットした Lambda 関数をデプロイしたいので、Connect with GitHub repository を選択します。
Codeship3

Codeship が GitHub へ接続できるように Authorize application して...
Codeship3

既存の Lambda 関数のために作成しておいた GitHub レポジトリ (ここでは NewFunction) を選択します。Codeship で新規の Lambda 関数を作成することはできません!
Codeship5

ヒント: AWS Documentation

次のページではデプロイのスクリプトを作成できますが、そのまま Save and go to dashboard を押してください。
Codeship6

以下のような画面になれば、Lambda 関数に対するプロジェクトを作成することができました。おめでとうございます!
Codeship7

環境変数とスクリプトの設定

Lambda 関数のデプロイには AWS CLI を使いますから、アクセスキーを用意する必要があります。新しい IAM ユーザーを作成し、以下のようなポリシーを割り当ててください。

Inline Policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:UpdateFunctionCode",
                "lambda:UpdateFunctionConfiguration",
                "lambda:InvokeFunction",
                "lambda:GetFunction",
                "lambda:PublishVersion",
                "lambda:UpdateAlias"
            ],
            "Resource": [
                "arn:aws:lambda:us-east-1:123456789012:function:NewFunction"
            ]
        }
    ]
}

アクセスキーの用意ができたら、Codeship プロジェクトに戻って Environment Variables へ進みましょう。
Codeship8

AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION の3つを設定して Save Configuration を押したら、Deployment ページへ移動します。
Codeship9

以下のページでは、デプロイのために監視するブランチを指定します。今回は master としました。
Codeship10

Save Pipeline Settings を押すと、Configure Your Deployment Pipelines へ移動します。下へスクロールして、Custom Script を選択してください。
Codeship11

いよいよデプロイに使うスクリプトを指定します。以下の例を貼り付けたら、NewFunction となっている箇所を実際の名称に書き換えてください。
Codeship12

pip install awscli
zip -r NewFunction.zip *
aws lambda update-function-code --function-name NewFunction --zip-file fileb://NewFunction.zip
version=`aws lambda publish-version --function-name NewFunction | jq -r .Version`
aws lambda update-alias --function-name NewFunction --function-version $version --name PROD
aws lambda get-function --function-name NewFunction
aws lambda invoke --function-name NewFunction --payload "$(cat data.json)" --qualifier PROD lambda_output.txt
cat lambda_output.txt

Create Deployment を押して、以下のような画面になれば完了です。おつかれさまでした!
Codeship13

デプロイ

Lambda 関数のレポジトリを開いて、master ブランチのコードに変更を加えてみます。
Codeship14

ぼけっとしていたところ、すでにデプロイが成功しています! どうやら、Codeship がブランチに対するコミットを検知するのは一瞬のようです。
Codeshift15

Preparing Virtual Machine とあります。これ、Lambda と変わらないんじゃ...
Codeshift16

それでもコードは書かない

いかがでしたか? 以上の手順を実際に試してみた方には、変更を加えたブランチの Lambda 関数が面白いようにデプロイされる様子をご覧いただけたかと思います。これこそプログラミング不要という世界の真髄ではありませんか! これからも小山は、いかにしてコードを書くことなく仕事を全うできるかというテーマについて追い求めていきたいと思います。おたのしみに!

元ネタ

Integrating AWS Lambda with Codeship - via @codeship | via @codeship
Deploy to AWS Lambda | Codeship Documentation

きょうの履歴から

AWS Lambda とは - AWS Lambda
バージョニング、エイリアス、リソースポリシー - AWS Lambda
ステップ 2: HelloWorld Lambda 関数を作成してコンソールを探る - AWS Lambda
ステップ 2.2: Lambda 関数を手動で呼び出し、結果、ログ、メトリックスを確認する - AWS Lambda