WindowsPCでWSL2を有効化してCDKとTerraformを使えるようにしてみた

2023.02.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、soraです。

今回は、WindowsPCでWSL2を有効化してCDKとTerraformが使えるようにしてみたことについて書いていきます。
想定より少し面倒だったので、どなたかの参考になれば幸いです。

WSL2有効化+Ubuntuインストール

Linux上で操作したほうが勝手が良いため、WSL2を有効化してUbuntuをインストールします。
インストール方法などは、以下のページにわかりやすくまとめられています。

以降はインストールしたUbuntu上でコマンドを実行していきます。

tfenvのインストール

Terraformをインストールします。
Terraformを使わない方は、スキップしていただいても問題ありません。

# Terraformのバージョン管理ツール「tfenv」のインストール
$ sudo apt update && sudo apt upgrade
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv
$ echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

# tfenvのバージョン確認
$ tfenv --version
tfenv 3.0.0-18-g1ccfddb

# インストール可能なTerraformのバージョン確認
$ tfenv list-remote
1.4.0-beta1
1.4.0-alpha20221207
1.4.0-alpha20221109
1.3.8
……
0.1.0

# Terraformのインストール
$ tfenv install 1.3.8
# ※zipが入っていなくてエラーになったため、zipのインストール
$ sudo apt-get install zip
# 改めてTerraformのインストール
$ tfenv install 1.3.8

# 使用するTerraformのバージョンを指定
$ tfenv use 1.3.8

AWS CLIのインストール

AWS CDKを使うために必要なAWS CLIをインストールします。

# AWS CLIのインストール
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

# AWS CLIのバージョン確認
$ aws --version
aws-cli/2.9.23 Python/3.9.11 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.ubuntu.22 prompt/off

Node.jsのインストール

AWS CDKを使うために必要なNode.jsをインストールします。
普通にaptでインストールすると、Node.jsのバージョンが古かったり、nodeコマンドでなくnodejsコマンドで登録されたりするらしいため、以下の参考ページに従ってNode.jsのバージョン管理ツール「n」を使ってインストールします。

参考:Ubuntuに最新のNode.jsを難なくインストールする

# Node.jsとnpmのインストール
$ sudo apt install -y nodejs npm

# Node.jsのバージョン管理ツール「n」のインストール
$ sudo npm install n -g

# バージョン管理ツール「n」を使って、nodeをインストール
$ sudo n stable

# 最初にインストールした古いnodejsとnpmの削除
$ sudo apt purge -y nodejs npm

# Node.jsのバージョン確認
$ node -v
v18.14.0

AWS CDKのインストール

いよいよAWS CDKをインストールします。

# AWS CDKのインストール
$ sudo npm install -g aws-cdk

# AWS CDKのバージョン確認
$ cdk --version
2.64.0 (build fb67c77)

AWS CDKの実行

AWS CDKを使うための準備が整ったため実行します。

AWSの認証情報について、aws configureで設定するとアクセスキーとシークレットアクセスキーが~\.aws\credentialsに平文で保存されます。これを避けるための暗号化については後述します。

またMFAを有効化している場合は、configファイルの修正が必要です。そちらも後述します。

# AWS認証情報の入力
$ aws configure

# CDK init
$ mkdir python-test
$ cd python-test
# 使用する言語に応じて、pythonの部分は書き換えてください。
$ cdk init app --language python

# Pythonを使う方向け
## 仮想環境を使うためにvenvのインストール
$ sudo sudo apt install python3-venv
## (参考)仮想環境を新しく作成してスイッチする場合
$ python3 -m venv <仮想環境名>
$ source <仮想環境名>/bin/activate
## 仮想環境へのスイッチ
$ source .env/bin/activate
## 必要なモジュールのインストール
(.env) $ pip install -r requirements.txt
# (参考)仮想環境を抜けるコマンド
(.env) $ deactivate

# CDKの実行
(.env) $ cdk synth
(.env) $ cdk bootstrap
(.env) $ cdk init
(.env) $ cdk diff
(.env) $ cdk deploy

(スイッチロールする方やMFA有効化している方向け)アクセスするプロファイルの指定

スイッチロールする場合やMFA有効化している場合は、AWSのconfigファイルにプロファイルを追記する必要があります。
configファイルは、これまで工程通りに進めていれば\\wsl.localhost\Ubuntu\home\"Ubuntuユーザ名"\.awsにあると思います。
以下に記載するconfigファイルは、MFA有効化したユーザA(default)からスイッチ先のIAMロール(profile )にスイッチロールする場合のものです。

参考:【小ネタ】AWS CLIでスイッチロールして作業を行うための設定をやってみた

config

[default]
region=ap-northeast-1
output=json

[profile <プロファイル名>]
region=ap-northeast-1
mfa_serial=<スイッチ元のIAMユーザのMFA識別子(ARN)>
role_arn=<スイッチ先のIAMロールのARN>
source_profile=default

コマンド実行時のデフォルトのプロファイルを変更します。
ターミナルを立ち上げるたびに設定するのが面倒な方は、~/.bash_profileに環境変数を書いてください。

$ export AWS_DEFAULT_PROFILE=<プロファイル名>

# 設定ファイルに書き込む場合
$ echo 'export AWS_DEFAULT_PROFILE=<プロファイル名>' >> ~/.bash_profile
$ source ~/.bash_profile

(TerraformでMFA有効化のユーザを使う方)鍵の暗号化

MFA有効化しているユーザを使用する場合、ここまでの設定だけではTerraformが使えません。
MFA有効化に対応するために必要な、AWSの認証情報をセキュアに保管するaws-vaultなどをインストールします。

ここでも環境変数を設定するため、ターミナルを立ち上げるたびに設定するのが面倒な方は、~/.bash_profileに環境変数を書いてください。

参考:aws-vaultをLinux環境でも使う方法【セキュリティ向上】

# aws-vaultのインストール(バージョン部分は必要に応じて修正してください。)
$ curl -L https://github.com/99designs/aws-vault/releases/download/v6.6.2/aws-vault-linux-amd64 -o /usr/local/bin/aws-vault
$ chmod 755 /usr/local/bin/aws-vault

# aws-vaultのバージョン確認
$ aws-vault --version
v6.6.2

# 暗号化のためのpassとgnupgのインストール
$ sudo apt-get update && sudo apt-get install -y pass gnupg

# 鍵の生成
$ gpg --gen-key
# 鍵が生成されていることの確認
$ gpg --list-keys
-----------------------------
pub   rsa3072 2023-02-14 [SC] [expires: 2025-02-13]
      <キーID>
uid           [ultimate] <鍵の生成時に入力した名前> <鍵の生成時に入力したメールアドレス>
sub   rsa3072 2023-02-14 [E] [expires: 2025-02-13]

# passのセットアップ(キーIDは鍵が生成されていることの確認で表示されたもの)
$ pass init <キーID>

# 環境変数の設定(一時的な認証情報の有効期限など)
$ export AWS_VAULT_BACKEND=pass
$ export AWS_VAULT_PASS_PREFIX=aws-vault
$ export AWS_SESSION_TOKEN_TTL=3h

# クレデンシャルの登録(アクセスキーとシークレットアクセスキーの登録)
$ aws-vault add default
# 設定後の確認
$ aws-vault list

# aws-vaultで設定した鍵を使用して、コマンドを実行
$ aws-vault exec <プロファイル名> -- <コマンド>

# aws-vault execを実行してエラーになる場合、環境変数GPG_TTYを操作中のターミナルに設定する
$ export GPG_TTY=$(tty)

最後に

今回は、「WindowsPCでWSL2を有効化してCDKとTerraformが使えるようにしてみた」について紹介しました。
興味がある方はぜひお試しください。