みずラテ

牛乳と水を2対1で。

AWS SAMのための開発環境をDockerで構築する

最近AWS SAMを使い始めたので開発環境構築について書いてみたいと思います。

今回作成する環境はこんな感じです。

  • lambda実行環境であるamazonlinux環境をDockerで作る
  • docker-composeしてVSCodeのRemote Containerでアクセスする

実際のサーバーレスアプリは次回作成してみるとして、今回はここまで作ってみます。
なお、macの環境で作っていますが、docker volumeを使うのでwindowsでも同じように作れるはずです。

ローカルにDockerの準備をする

Docker for macはインストール済みという前提で進めます。インストールしていない人は先にインストールしてください。インストール後、ローカルの自分の好きなディレクトリで以下コマンドを打ってください。

$ mkdir amznlinux
$ mkdir amznlinux/.devcontainer
$ touch amznlinux/docker-compose.yml
$ touch amznlinux/Dockerfile
$ touch amznlinux/.devcontainer/devcontainer.json

こんな感じのツリー構造になっているでしょうか。

├── amznlinux
│   ├── .devcontainer
│   │   └── devcontainer.json
│   ├── Dockerfile
│   └── docker-compose.yml

続いて、それぞれのファイルの中を記述していきます。

まずDockerfileにはユーザーを作成し、aws-cli、aws-sam-cliのインストールをしていきます。
また、インストールにあたりlinuxbrewを使っていますので、まずそれをインストールします。
そのあたりの手順は公式に書いてありますので、それをベースに作っています。

https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install-linux.html

FROM amazonlinux:2
RUN yum update -y
RUN yum install -y git tree tar sudo bzip2 gcc-c++ make wget e4fsprogs
RUN yum clean all

# ユーザを作成
RUN useradd awsuser && \
	echo "awsuser    ALL=(ALL)       ALL" >> /etc/sudoers && \
	echo "%wheel  ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers && \
	gpasswd -a awsuser wheel

#localeとタイムゾーンの設定
RUN yum reinstall -y glibc-common
RUN cp /usr/share/zoneinfo/Japan /etc/localtime
RUN echo "export LANG=ja_JP.UTF-8" >> /home/awsuser/.bash_profile

#Docker install
RUN amazon-linux-extras install docker

# Linuxbrewのインストール
USER awsuser
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
RUN eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
RUN echo "eval \$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" >>~/.bash_profile
ENV PATH $PATH:/home/linuxbrew/.linuxbrew/bin

# awscliとaws-sam-cliのインストール
RUN brew install awscli
RUN brew tap aws/tap
RUN brew install aws-sam-cli

USER root

docker-composeファイルは非常にシンプルな構成です。
なお、冒頭でもあったようにdocker volumeを使っていますので、volumesを定義します。

version: '3.7'
services:
  amznlinux:
    build: .
    command: /sbin/init
    privileged: true
    volumes:
      - amznlinux:/home

volumes:
  amznlinux:
    external: true

最後にVSCodeのRemote Containerを使用するための設定ファイルになります。
lambdaの開発にはpythonを使う想定なので、pythonの拡張機能を追加しておくと良いと思います。それ以外はお好みで必要な拡張機能を追加してください。

{
  "name": "AmazonLinux",
  "dockerComposeFile": [
    "../docker-compose.yml"
  ],
  "service": "amznlinux",
  "workspaceFolder": "/home",
  "extensions": [
    "ms-python.python"
  ]
}

Dockerの事前設定

ファイルの準備ができたら実際にDockerを構築していきましょう。
まずはdocker pullでイメージを取得します。そして、amznlinuxというdocker volumeを作成し、そこにデータを永続化するようにします。

docker pull amazonlinux:2
docker volume create amznlinux


完了したら、先ほど作成したDockerfileとdocker-composeファイルを使ってdocker-compose buildをします。
docker-composeするときはdocker-compose.yml配下のディレクトリに移動することに注意。

cd amznlinux
docker-compose build

5分くらいかかると思います。

Successfully built

と表示されたら完成です。

VSCodeのRemote Container準備

続いてVSCodeを開き、拡張機能で「ms-vscode-remote.remote-containers」と検索してください。
f:id:taris777:20200206212021p:plain
これをインストールします。

インストールが完了したら左下に以下のボタンが表示されていると思います。
f:id:taris777:20200206212117p:plain

緑のところをクリックすると、画面上部に以下のコンソールが出ますので、
f:id:taris777:20200206212212p:plain
「Remote-Conteiners: Open Folder in Conteiner...」をクリックします。

出てきたファインダーで、amznlinuxのディレクトリを選択して、開くをクリック。
すると自動的にリモート接続されます。うまくいけば以下のような画面になるはず!

f:id:taris777:20200208184143p:plain

あとはVSCode上のターミナルで、AWS CLIとAWS SAM CLIがインストールされているか確認してみてください。

su - awsuser
aws --version
sam --version

以上で開発環境の構築は完了です。あとはsam initなり、git cloneなりして開発を始められると思います。

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)