僕のメモ帳

僕のメモ帳です。

Goの勉強 環境構築編

こんにちは。たかしです。

 

会社からの要望で、Go言語とAmazon Web Service(AWS)の勉強をすることになりました。

 

特に

  • Go
  • AWSのデータベース
  • AWS Lambda

ここを勉強してほしいと言われたことと、オススメ図書を教えてもらいましたので、まずはその本をやりながらブログ書いていこうかと思います。

 

ただの技術ブログだとつまらないので、読み物としても面白くなるように文章も頑張ります。

 

僕がオススメされた本はこちらです。kindle unlimited入っているので月額で読めました、ラッキー!

www.amazon.co.jp


 

まずは環境構築…いきなり問題発生

 さあ、まずは環境構築するか!ってことで「第一章 環境構築」を開く。

macOSでの開発を前提としています』だと…?!

 

家ではWindowsを使っている僕。(しかも20代前半で買ってそろそろ10年くらい経つ)

しかも、第二章を確認するとこの環境構築の章で扱っているものをかなり扱っている模様。

Windows向けに同じものをインストールしていく必要がありそう…

そういえば、昔勉強するためにAWSのアカウント作ったなー。AWS環境にGoインストールして使うかー。と思い、自分のEC2環境に構築することに。

使用しているOSは、Linuxです。

 

というわけで、早速インストール。

 

ブログ書きながら進めたので、作業はだいたい3時間ほどかかりました。

書かなければすぐ終わると思います。笑

 

anyenv

$ git clone https://github.com/riywo/anyenv ~/.anyenv

$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc

$ echo 'eval "$(anyenv init -)"' >> ~/.bashrc

$ exec $SHELL -l

 

「exec $SHELL -l」が「exec $SHELL -1」に見えてしまい打ち間違い。コマンドが落ちてしまった。。。

再ログインするとこんなメッセージが表示された。

ANYENV_DEFINITION_ROOT(/home/ec2-user/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
> anyenv install --init

 

念のため、初期化しておく。

$ anyenv install --init
Manifest directory doesn't exist: /home/ec2-user/.config/anyenv/anyenv-install
Do you want to checkout ? [y/N]: y
Cloning https://github.com/anyenv/anyenv-install.git master to /home/ec2-user/.config/anyenv/anyenv-install...
Cloning into '/home/ec2-user/.config/anyenv/anyenv-install'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 62 (delta 1), reused 1 (delta 0), pack-reused 57
Unpacking objects: 100% (62/62), done.

Completed!

 

ふー。これで何とかなったのかな?

 

 anyenvupdate

続いて、anyenvupdateを実行する。

$ mkdir -p $(anyenv root)/plugins

$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

$ anyenv update

 

盛大にログ出るかと思ったら、結構あっけない量しかログが表示されなくて、本当にアップデートできているのか不安。笑

 

goenvとGo

いよいよGoのインストールだ。

goenvっていうのはGoのバージョン管理用のツールらしい。この本ではanyenv配下で管理をしていくとのこと。

$ anyenv install goenv

$ exec $SHELL -l

$ goenv install --list

 

インストールは、「goenv install --list」で表示されたバージョンの中から指定して実行するらしい。

使用している本はちょっと古いのでVer1.11.2らしい。

僕がこのブログ書いているときの最新はVer1.16.2 。

なので、1.16.2をインストールしておくことにします。

$ goenv install 1.16.2

 

利用するバージョンも指定する必要があるらしい。

「global」と「local」の二つがあって、システム全体で利用するなら「global」。特定ディレクトリ内なら「local」。という使い分けをするようだ。

システム全体で使いたいので、迷わず「global」で行けよ。行けばわかるさ。

$ goenv global 1.16.2

$ goenv global
1.16.2

 

本には書いてなかったけど、Goのバージョンを確認してみる。

$ go version
go version go1.16.2 linux/amd64

うん。ちゃんと1.16.2になってる。

 

最後に、GOPATHを指定してあげる必要があるようだ。指定先はどこでもいいようなので、とりあえず作業領域に設定しておく。

$ export GOPATH=/home/ec2-user/work

$ printenv GOPATH
/home/ec2-user/work

 

exportで設定したけど、ログイン時に毎回設定するの面倒なので「.bash_profile」に書き込んじゃうか。

$ echo 'export GOPATH=/home/ec2-user/work' >> ~/.bash_profile

$ tail -1 ~/.bash_profile
export GOPATH=/home/ec2-user/work

これで次回からログインしても設定する必要ないかな。

 

pyenvとPython

この本では、Pythonのインストールも必要らしい。

pyenvというのはPythonのバージョン管理ツールとのこと。先ほど利用したgoenvと同じですね。(※爆乳戦隊パイレンジャーのパイではありません)

$ anyenv install pyenv

$ exec $SHELL -l

 

ここから先も、goenvと使い方同じですね。

バージョン確認して、バージョン指定でインストール。利用するバージョンの指定をするようだ。

$ pyenv install --list

 

最新版のPythonを入れたいところだが、このあとインストールする「aws-sam-cli」というののサポートがPython2.7と3.6をサポートしているらしい。だから3.6をインストール。すると思いきや、この本によると3.7でも問題なく動いたから3.7インストールしようぜ!とのこと。まあ、3.7でも最新版ではないのだけど、ここは本に従うことにする。

$ pyenv install 3.7.0

~~~

BUILD FAILED (Amazon Linux 2 using python-build 1.2.26)

~~~

make: *** [install] Error 1

 ん?んんん???インストールエラー???

インストールできなかったら先に進めないけど、AWSに最初からPythonインストールされているならそれでいいよね。と思い、バージョン確認実施!

$ python --version
Python 2.7.18

よかったー!最初からインストールされてたじゃん!しかもサポートされている2.7で。なんて喜んでいたら、この後利用する「pip」コマンドがPython3.6からじゃないと対応していないんだってさ。(ブログでは端折ってますが、2.7のまま突き進んでエラーになって調べた。)

 

というわけで、違う手順を使ってバージョンアップを試します。

参考にしたのはこちらの記事。

docs.aws.amazon.com


 

さあ、バージョンアップだ!

$ sudo yum update

$ sudo yum install python3 -y

OK!

 

$ python --version
Python 2.7.18
$ python3 --version
Python 3.7.9

おー、 Pythonで見ると2.7.18だけどPython3で見ると3.7.9だ。

 

GoとPythonのバージョン確認

anyenvでインストールしたものは一覧で確認とれるらしい。さっき調子に乗ってGoもPythonもバージョン確認してしまったけど、ここでも確認しておく。

$ anyenv version
goenv: 1.16.2 (set by /home/ec2-user/.anyenv/envs/goenv/version)
pyenv: system (set by /home/ec2-user/.anyenv/envs/pyenv/version)

pyenvの「system」はインストールした3.7.9のことを言ってくれているんだと捉えて次行きますー

 

aws-cli

AWSのサービスを操作するためのツールとして「aws-cli」というのを使うらしい。

$ pip install awscli
bash: pip: command not found

あれれ。pipなんてコマンドは無いよって言われてしまった。

 

調べてみたら、インストールしてくる必要がある様子。

$ curl -kL https://bootstrap.pypa.io/get-pip.py | python

~~~

ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.6. Please use https://bootstrap.pypa.io/pip/2.7/get-pip.py instead.

3.6以上じゃないとだめだよって言われた。うおーめんどくせーーーー!

 

でもさ、待ちたまえよ。「Python」でバージョン確認したら2.7だったけど、「Python3」で確認したら3.7だったよね。つまりこういうことだ…

$ curl -kL https://bootstrap.pypa.io/get-pip.py | python3

~~~

Installing collected packages: wheel, pip
Successfully installed pip-21.0.1 wheel-0.36.2

はいビンゴ! 

 

では、再実行します。

$ pip install awscli

$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.219-164.354.amzn2.x86_64 botocore/1.18.6

インストール成功!Pythonが2.7って表示されているのが気に食わないけど、まあいいでしょう。

 

クレデンシャルのセットが必要らしい。

$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-1
Default output format [None]:

とりあえずこれでOKかな?何か問題あったら都度修正しよう。

 

aws-sam-cli

続いて、aws-sam-cliをインストール。AWS Lambdaの実行とかができるようになるらしい。Dockerにも依存しているらしく。Dockerのインストールも必要。僕はDockerの勉強していたのでインストール済み。

 

では、早速aws-sam-cliをインストール。

$ pip install --user aws-sam-cli

 

続いて、環境変数のセット。

$ USER_BASE_NAME=$(python -m site --user-base)
$ export PATH=$PATH:$USER_BASE_NAME/bin

 

これも設定ファイルに書いておくか。

$ echo 'USER_BASE_NAME=$(python -m site --user-base)' >> ~/.bash_profile

$ echo 'export PATH=$PATH:$USER_BASE_NAME/bin' >> ~/.bash_profile

$ tail -3 ~/.bash_profile
export GOPATH=/home/ec2-user/work
USER_BASE_NAME=$(python -m site --user-base)
export PATH=$PATH:$USER_BASE_NAME/bin 

 

バージョン確認

$ exec $SHELL -l
$ sam --version
SAM CLI, version 1.21.1

 

これでaws-sam-cliのインストールは完了らしい。

 

saw

ホラー映画ではなく、CloudWatch Logsに出力されるログをコマンド画面に流してくれるツールとのこと。

早速インストール。

$ pip install saw

これで完了かな。

 

direnv

特定のディレクトリ配下の環境変数を管理するためのツールらしい。

$ git clone https://github.com/direnv/direnv

$ cd direnv

$ sudo su

# make install

ほい。インストール完了。

 

シェルにフックを設定する。

$ export EDITOR=vim
$ eval "$(direnv hook bash)"

 

ここら辺も設定ファイルに入れておこうかな。

$ echo 'export EDITOR=vim' >> ~/.bash_profile

$ echo 'eval "$(direnv hook bash)"' >> ~/.bash_profile

$ tail -5 ~/.bash_profile
export GOPATH=/home/ec2-user/work
USER_BASE_NAME=$(python -m site --user-base)
export PATH=$PATH:$USER_BASE_NAME/bin
export EDITOR=vim
eval "$(direnv hook bash)"

 

dep

Goの依存関係を管理するためのツールとのこと。

ただ、MACLinuxでは手順が違う上にうまくインストールできなかったので、いったんパスします。


gig

使用している本の筆者さんが作ったツールらしい。

いよいよLinuxへのインストール方法がわからなかったのでこれもパス。

 

環境構築終了

これで環境構築終了!

depとgigはどうしても必要そうだったらインストール方法考えます。

 

今日はここまで!

 

次回は本の第二章部分を書きます。

時間かかるかもなので、のんびり更新してきます。

 

ではまた今度。