EC2 on LocalStack

前回作成したLocalStack上にEC2インスタンスを起動します。まだLocalStackを起動していない方は以下の記事を参考にしてください。

https://qiita.com/nw-engineer/items/886bee5e5caf5e0169e8

また、LocalStack上でEC2インスタンス起動するための説明は以下のページに記載があります。

https://docs.localstack.cloud/user-guide/aws/ec2/

# 1. イメージファイル取得
まずはEC2インスタンス用のDockerイメージファイルを取得します。
```bash
docker pull ubuntu:focal
docker tag ubuntu:focal localstack-ec2/ubuntu-focal-ami:ami-000001
```

# 2. コンテナ起動 & Packageインストール
次にコンテナを起動して最低限のパッケージを入れておきます。これをしないとEC2インスタンスとして起動しても何もできないので、事前にやっておきます。
```bash
docker container run -it --name test01 localstack-ec2/ubuntu-focal-ami:ami-000001 /bin/bash
apt update
apt install -y wget curl vim git procps net-tools iputils-ping
```

# 3. コミット
別ターミナルを立ち上げて、起動したコンテナをコミットします。
```bash
docker ps #コンテナIDを特定
docker commit コンテナID localstack-ec2/ubuntu-focal-ami:ami-000002
```
コミットしたら、立ち上げたコンテナはexitしておきましょう。


# 4. EC2インスタンスとして起動
続いて、LocalStackコンテナにログインし、SSH-Keyを作成してEC2インスタンスを起動します。LocalStackコンテナ外からSSHできるよう鍵は/tmpにコピーしておきます。
```bash
docker exec -it localstack-main /bin/bash
awslocal ec2 create-key-pair --key-name newKey --query 'KeyMaterial' --output text | tee newKey.pem
awslocal ec2 run-instances --image-id ami-000002 --count 1 --instance-type t3.small --key-name newKey
cp -pr newKey.pem /tmp/
```
LocalStackのステータスを見ると、インスタンスが起動しているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/9fab8e8d-4407-f9db-3fc1-5385e1e0fa1e.png)



# 5. EC2インスタンスへ接続
先程の手順にてコピーした鍵をDockerホスト側にコピーしてEC2インスタンスとして起動したコンテナを確認します。
```bash
docker cp localstack-main:/tmp/newKey.pem ./
docker ps
```

```
49d240ddc1ce   localstack-ec2/ubuntu-focal-ami:ami-000002   "sleep infinity"         27 hours ago   Up 27 hours           0.0.0.0:30145->22/tcp, :::30145->22/tcp
```
ここではDockerホスト30145番PortがEC2インスタンスの22番Portに紐づけられていることがわかります。では、以下のコマンドでEC2インスタンスとして起動したコンテナにログインします。

```bash
root@localstack001:~# ssh -i newKey.pem -p 30145 root@127.0.0.1
root@49d240ddc1ce:~# #ログインOK
```

起動したEC2インスタンス上でパッケージを入れたい場合は/etc/resolv.confを修正しておきましょう

```bash
vim /etc/resolv.conf
```

```bash: /etc/resolv.conf
# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

#nameserver 127.0.0.11  # コメント
nameserver 8.8.8.8      # 追記
search .
options ndots:0

# Based on host file: '/run/systemd/resolve/resolv.conf' (internal resolver)
# ExtServers: [172.18.0.2]
# Overrides: [nameservers]
# Option ndots from: internal
```

これでinternetに出れます。
```bash
root@49d240ddc1ce:~# apt update
Hit:1 http://archive.ubuntu.com/ubuntu focal InRelease
Get:2 http://archive.ubuntu.com/ubuntu focal-updates InRelease [128 kB]
Hit:3 http://archive.ubuntu.com/ubuntu focal-backports InRelease
Get:4 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1530 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [4228 kB]
Get:6 http://security.ubuntu.com/ubuntu focal-security InRelease [128 kB]
Get:7 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [3758 kB]
Get:8 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [1245 kB]
Fetched 11.0 MB in 8s (1321 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
```