かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Go 言語で学ぶ AWS Lambda の学習用環境構築メモ

技術書典 7 で Goで学ぶAWS Lambda を見て BOOTH で購入しました。

booth.pm

さくっとみてみると macOS 上に Python, aws cli, go, docker などを入れてます…

う~ん、どれも普段使わない関係のものなので PC に直接入れたくない…!?ということで最近試してみてる Visual Studio Code のリモート開発で環境を作ってみようと思います。

docker on docker しないといけなくなったら、その時にまた頑張ろう。ということでとりあえず AWS の CLI と go が入ってる状態を目指します。

ベースとなるテンプレート

単一コンテナーだけで済まなくなるケースも考えて docker-compose を使っていて AWS CLI に必要な Python が入ってるものということで、Python 3 & PostgreSQL を選びました。

f:id:okazuki:20190923144657p:plain

.devcontainer フォルダーに Dockerfile があるので Python 以外にも Go 言語も入れます。元ネタは Go 言語の公式イメージの Dockerfile

github.com

これとマージしつつ AWS CLI も pip でインストールするようにして以下のような Dockerfile になりました。 無駄はありそうなものの、まぁ動くのでとりあえずよしとしよう。

LearningAWSLambda/Dockerfile at 2079fb87aca270eba075fbd509ab76c3e2a042b1 · runceel/LearningAWSLambda · GitHub

.devcontainer/docker-compose.yml は DB 環境がいらないのですっきりさせましょう。

version: '3'

services:
  app:
    build: 
      context: ..
      dockerfile: .devcontainer/Dockerfile

    volumes:
      - ..:/go/src
    
    command: sleep infinity

.devcontainer/docker-compose.secret.yml ファイルを作って AIM の ID と KEY を環境変数に入れておきます。

version: '3'

services: 
  app:
    environment: 
      - AWS_ACCESS_KEY_ID=xxxxxx
      - AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxx
      - AWS_DEFAULT_REGION=ap-northeast-1
      - AWS_DEFAULT_OUTPUT=json

この .devcontainer/docker-compose.secret.yml.gitignore でリポジトリーには上がらないようにしておきました。

.devcontainer/devcontainer.json は、とりあえず /go/src を作業用のフォルダーにして Go と AWS の拡張機能を入れておく感じにしておきました

{
    "name": "Learning for AWS Lambda using Golang",
    "dockerComposeFile": [
        "docker-compose.yml",
        "docker-compose.secret.yml"
    ],
    "service": "app",
    "workspaceFolder": "/go/src",
    "extensions": [
        "ms-vscode.go",
        "amazonwebservices.aws-toolkit-vscode"
    ]
}

この状態でリモート開発機能でオープンすると…

f:id:okazuki:20190923155626p:plain

go コマンドも叩けて aws コマンドも叩けて aws s3 ls もエラーが出なかったので、ちゃんと S3 作れば結果が返ってくると信じたい。

適当に Go の Hello world を書いて F5 を押してみたらちゃんとデバッグもできた。

f:id:okazuki:20190923155904p:plain

そろそろ、本を読み始めてもいいかな??ということでゲームしよう。

時刻がずれてた

コンテナー上のイメージの時刻がずれてて aws s3 ls が失敗してたので、以下のページを参考にしました。

qiita.com

私の場合は最初からチェックが入ってたので、一度オフにして適用したあとに、またオンにしたら時刻がちゃんとなりました。