ちょっと話題の記事

Amazon Linux 2 の Dockerイメージから開発環境を作り Visual Studio Codeで接続してみる

2021.08.26

Amazon Linux 2のDockerイメージから開発環境として使うコンテナを作り、Visual Studio Codeで接続してみました。 コンテナは以下をインストール or 可能としてみました。

  • AWS CLIをインストールする。かつクレデンシャルはローカルのものをコンテナ内でも使えるようにする。
  • (開発言語として)Go言語をインストールする。
  • ローカルマシンとコンテナで共有できるフォルダを作成する。

以下、今回作成した「docker-compose.yml」と「Dockerfile」について書いていきたいと思います。

作成したもの

ローカル環境について

本作業はMacで行いました。docker-composeとDockerがインストールされているものとします。docker-composeとDocker、Visual Studio Codeがインストールされているものとします。

Visual Studio Codeについては、コンテナに接続するためのRemote Containerをインストールしておいてください。

ローカルにAWSに接続可能なクレデンシャルがあるものとします。

フォルダ構成について

ローカルマシンのフォルダ内に、「docker-compose.yml」と「Dockerfile」、それとコンテナと共有するための「share」フォルダを作成します。構成としては以下のようになります。

.
├── Dockerfile
├── docker-compose.yml
└── share/

docker-compose.yml と Dockefileについて

「docker-compose.yml」は以下のようになりました。

docker-compose.yml

version: "3.7"

services:
  amzn-linux-2:
    build: .
    container_name: amzn-linux-2
    privileged: true
    restart: always
    volumes:
      - type: bind
        source: ./share
        target: /share
      - type: bind
        source: ~/.aws
        target: /home/ec2-user/.aws

「docker-compose.yml」ではクレデンシャルをコンテナと共有するため、9行目からの「volumes」にてローカルの「~/.aws」フォルダをコンテナとbindしています。またローカルの「share」フォルダをコンテナと共有するため、こちらも「volumes」にてbindするよう定義しています。 コンテナ名は「amzn-linux-2」としてみました。

「Dockerfile」は以下のようになりました。

Dockerfile

FROM amazonlinux:2

# install amazon-linux-extras install
RUN amazon-linux-extras install -y

# yum update & install
RUN yum update -y \
    && yum install \
        systemd \
        tar \
        unzip \
        sudo \
        -y

# install aws cli v2
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
    && unzip awscliv2.zip \
    && sudo ./aws/install

# create user
RUN useradd "ec2-user" && echo "ec2-user ALL=NOPASSWD: ALL" >> /etc/sudoers

# install for develop, etc.
RUN sudo amazon-linux-extras install golang1.11 -y

# init
CMD ["/sbin/init"]

「Dockerfile」の1行目では、タイトルの書いたようにAmazon Linux 2 の Dockerイメージを使うため、「FROM amazonlinux:2」を記載しています。

4行目の「RUN amazon-linux-extras install -y」ですが、開発環境用ということで「amazon-linux-extras」をインストールしてみました。「amazon-linux-extras」を入れると、さまざまなパッケージをamazon-linux-extrasを使ってインストールすることができます。今回もこの後で書くGo言語のインストールで使用しています。 「amazon-linux-extras」については、以下も参考にしてみてください。

Amazon Linux 2のExtras Library(amazon-linux-extras)を使ってみた

7・8行目からのyum installでは、今回必要だったものをyumを使ってインストールしています。案件によっては、wgetなど必要なものをここに追加してもいいと思います。

16行目では aws cli v2をインストールしています。

21行目では、作業用ユーザとして「ec2-user」を作成しています。このユーザ名は案件によって適宜変えてもいいかと思います。

24行目では、「amazon-linux-extras」を使いGo言語をインストールしています。ここも案件によっては違う言語を指定 or 必要なものをインストールすることになるかと思います。

コンテナを起動してVisual Studio Codeで接続してみる

「docker-compose.yml」と「Dockerfile」があるフォルダにて以下のコマンドを実行します。

$ docker-compose up -d

「docker ps」コマンドを叩き、「amzn-linux-2」のコンテナが動いていることを確認します。次にVisual Studio Codeを開き、コマンドパレットより「Remote-Containers: Attach to Runnning Container...」を選択します。動いているコンテナの一覧が表示されるので、起動した「amzn-linux-2」を選択します。

Remote Containerで接続できたら、Visual Studio Codeのターミナルを開きます。色々作業はできるかと思いますが、今回は「docker-compose.yml」「Dockerfile」にて設定やインストールしたものが使えるかを確認してみました。

まずユーザを「ec2-user」にしてみます。

$ su - ec2-user
[ec2-user@xxxxxxxxxxxx ~]$ pwd
/home/ec2-user

次にaws cliです。ターミナルにて以下のように入力し、aws cliのバージョンが表示されること、任意のクレデンシャル(以下の例では「sample」)で「aws s3 ls」コマンドが実行できることを確認してみます。

[ec2-user@xxxxxxxxxxxx ~]$ aws --version
aws-cli/2.2.30 Python/3.8.8 Linux/5.10.25-linuxkit exe/x86_64.amzn.2 prompt/off
[ec2-user@xxxxxxxxxxxx ~]$ aws s3 ls --profile sample
...(存在するS3バケットが表示される)

Go言語についても確認してみます。ローカルとの共有フォルダ「/share」に「src」フォルダを作り、そこに簡単なGo言語のプログラムを書いて実行してみます。

[ec2-user@xxxxxxxxxxxx ~]$ go version
go version go1.15.14 linux/amd64
[ec2-user@xxxxxxxxxxxx ~]$ mkdir /share/src
[ec2-user@xxxxxxxxxxxx ~]$ touch /share/src/sample.go

Go言語のプログラム「sample.go」は以下のようにしてみました。

sample.go

package main

import "fmt"

func main() {
	fmt.Println("ok")
}

「sample.go」を作成したら、「go run」にて実行してみます。

[ec2-user@xxxxxxxxxxxx ~]$ go run /share/src/sample.go 
ok

Go言語のプログラムが実行できることが確認できました。最後に、作成した「sample.go」がローカルの「share/src」フォルダに存在していて、コンテナと共有されていることを確認してください。

まとめ

今後よく使うであろうツール & 言語を入れたコンテナを作成してみました。案件のよってコンテナにインストールするものを変えることで、ローカルに色々インストールすることなく開発環境を構築できるのではないかと思います。 何かの役に立てば幸いです。

参考サイト

追記

以下の記事で作業用ユーザで接続してVisual Studio Codeでデバッグすることについて追加しました。

[小ネタ][Visual Studio Code]Dockerイメージの開発環境に作業用ユーザで接続する & Go言語でリモートデバッグをしてみる