Help us understand the problem. What is going on with this article?

DockerでGoの開発環境を作ってServerlessでAWS Lambdaにデプロイしてみた

More than 1 year has passed since last update.

Goを使ってみようかなと思い立ったので、まずは開発環境を構築してみました。

前提

  • Dockerがインストール済み
  • AWSのアカウントがある
  • AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY がある
> docker --version
Docker version 18.09.0, build 4d60db4

> docker-compose --version
docker-compose version 1.23.1, build b02f1306

手順

GitHubにソースをアップしていますので、よければご参考ください。
https://github.com/kai-kou/deploy-in-go-lambda-with-sls-on-docker

Dockerコンテナの作成

> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> touch Dockerfile
> touch docker-compose.yml

Dockerfileは下記を参考にserverlessをインストールしています。

yunspace/serverless-golang: AWS Lambda Go functions using Serverless Framework and Python shim
https://github.com/yunspace/serverless-golang

Dockerfile
FROM golang:latest

ENV SERVERLESS serverless@1.30.1
ENV GOPATH /go
ENV PATH $GOPATH/bin:/root/.yarn/bin:$PATH

RUN apt-get update && \
    apt-get install git
RUN go get -u github.com/rancher/trash
RUN curl --silent --location https://deb.nodesource.com/setup_6.x | bash - && \
    apt-get install -y nodejs
RUN curl -o- -L https://yarnpkg.com/install.sh | bash
RUN npm install -g $SERVERLESS

docker-compose.ymlは下記を参考にvolumes を指定しました。

Docker Compose で Go の開発環境をサクッと作る - Qiita
https://qiita.com/macoshita/items/827ae5ac245b94ed4b4c

コンテナ内でserverlessを用いてデプロイまで実行したかったので、environment にAWSのアカウント情報を含めました。

docker-compose.yml
version: '2'
services:
  app:
    build: .
    volumes:
      - 'data:/go'
      - '.:/go/src/app'
    environment:
      - AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
volumes:
  data:
    driver: 'local'

AWS CLIがインストール済みの場合、$HOME/.aws/credentials にアカウント情報が保存されていると思いますので、それを環境変数に設定します。

Cameron Eckelberry - Full Stack Developer
https://cameroneckelberry.co/words/getting-aws-credentials-into-a-docker-container-without-hardcoding-it

bash
> export AWS_ACCESS_KEY_ID=$(aws --profile default configure get aws_access_key_id)
> export AWS_SECRET_ACCESS_KEY=$(aws --profile default configure get aws_secret_access_key)
fish
> set -x AWS_ACCESS_KEY_ID (aws --profile default configure get aws_access_key_id)
> set -x AWS_SECRET_ACCESS_KEY (aws --profile default configure get aws_secret_access_key)

準備ができたら、コンテナを立ち上げます。

> docker-compose build
()
Successfully built 25cabb8b3be0
Successfully tagged 任意のディレクトリ_app:latest

> docker-compose run app

root@148f0f743c3f:/go#

プロジェクトの作成とビルド

無事にコンテナ内へ入れたら下記を参考にserverless でGoのプロジェクトを作成して、必要なパッケージをインストールしてビルドします。

Serverless FrameworkでGolangのLambda関数を作成してみる | DevelopersIO
https://dev.classmethod.jp/etc/serverless-framework-golang-lambda-create/

コンテナ内
> cd src/app
> serverless create \
  -u https://github.com/serverless/serverless-golang/ \
  -p hello-go-lambda

> cd hello-go-lambda
> go get github.com/aws/aws-lambda-go/lambda
> GOOS=linux go build -o bin/main

AWS Lambdaへデプロイ

AWS Lambdaへデプロイします。serverless.ymlはそのままでもデプロイできますが、region などを変更したい場合には編集してからデプロイしてください。

コンテナ内
> serverless deploy
()
Serverless: Stack update finished...
Service Information
service: hello-go-lambda
stage: dev
region: us-east-1
stack: hello-go-lambda-dev
api keys:
  None
endpoints:
  None
functions:
  hello: hello-go-lambda-dev-hello

デプロイできたら実行してみます。

コンテナ内
> serverless invoke -f hello

{
    "message": "Go Serverless v1.0! Your function executed successfully!"
}

やったぜ。

後片付け

デプロイしたLambda関数を削除する場合、以下コマンドを実行します。

コンテナ内
> serverless remove

Serverless: Getting all objects in S3 bucket...
Serverless: Removing objects in S3 bucket...
Serverless: Removing Stack...
Serverless: Checking Stack removal progress...
..........
Serverless: Stack removal finished...

まとめ

serverlessを利用するのにnode.jsをインストールする必要があるのが、若干手間ですが、思ってたよりも簡単に環境構築することができました。

参考

yunspace/serverless-golang: AWS Lambda Go functions using Serverless Framework and Python shim
https://github.com/yunspace/serverless-golang

Docker Compose で Go の開発環境をサクッと作る - Qiita
https://qiita.com/macoshita/items/827ae5ac245b94ed4b4c

Docker上でgolangの開発環境を整える - Qiita
https://qiita.com/yasuno0327/items/be7fb992054f40b491cc

Serverless FrameworkでGolangのLambda関数を作成してみる | DevelopersIO
https://dev.classmethod.jp/etc/serverless-framework-golang-lambda-create/

ServerlessインストールからLambdaへのデプロイ - Qiita
https://qiita.com/jumjamjohn/items/abbc060fd2c1c6791ef3

Serverless Framework(Go) でHello worldしてみる - Qiita
https://qiita.com/seike460/items/b54a61ec8d07b2be8c87

Docker Compose - docker-compose.yml リファレンス - Qiita
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa

Cameron Eckelberry - Full Stack Developer
https://cameroneckelberry.co/words/getting-aws-credentials-into-a-docker-container-without-hardcoding-it

Fish Shellでコマンドの実行結果を変数に代入する方法 | Web Scratch
https://efcl.info/2013/0520/res3282/

kai_kou
2004年からWeb系のシステムエンジニアとして開発、運用、マネジメントを経験。現在はアイレット(クラウドパック)に所属。 べ、別にいいね貰えたからってモチベーションが上がって記事とコードの品質があがるわけじゃないんだからね///
https://twitter.com/k_aik_ou
cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス
https://cloudpack.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした