【UnauthorizedOperation】EC2インスタンス作成時にエラーが起きたので備忘録

## 概要

DockerホストからEC2インスタンス上でコンテナ起動時にエラーがおきました。
AWSもDockerもDockerマシンも学習中を始めたばかりでエラーが起きたときに手探りで進めているという感覚ですが、解決できたので備忘録としてまとめさせていただきます。また、同じエラーに悩まれている方がいれば、その方の一助となれば幸いです。遠回りをしているかもしれませんが、そのときはご意見を頂きたく存じます。

***#追記***
AWSのキーペアは一つ作れば他のものにも既存のキーペアを使えばこのようなことは起こらないと思います。インスタンスごとにキーペアを設ける予定、設けてエラーが起きているという方には参考になるかもしれません。

## 仮説検証

まずこちらが今回のエラー文です。エラー文から考えられることを仮説検証してエラーを解決していきます。

```terminal:ターミナル
% docker-machine create --driver amazonec2 --amazonec2-open-port 8000 --amazonec2-vpc-region ap-northeast-1　<EC2インスタンス名>
(EC2インスタンス名) Couldn't determine your account Default VPC ID : "UnauthorizedOperation: You are not authorized to perform this operation.\n\tstatus code: 403, request id: <~~request id~~>"
Error setting machine configuration from flags provided: amazonec2 driver requires either the --amazonec2-subnet-id or --amazonec2-vpc-id option or an AWS Account with a default vpc-id
```


> 1.デフォルトのVPCがない

VPCダッシュボードを確認したところ存在していたので、原因はこれではなかったみたいです。vpc-idを引数で直接指定しましたが、それでもEC2インスタンス作成することはできませんでした。

> 2.UnauthorizedOperation

この操作を操作する権限がないというエラー。

- [EC2 インスタンスを起動しようとすると、「この操作を実行する権限がありません」というエラーメッセージが表示されるのはなぜですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-not-auth-launch/)

こういうときは極力***一次情報を見て解決したほうが今後の応用も効くし間違いない情報***なので確認していきました。

さっそく解決方法の手順を踏んで解決していこうかとおもっていたところ、出鼻をくじかれました。
 

```terminal:ターミナル
% aws --version
```
***awsのコマンドが使えない*** `command not found:aws`というエラー文。

ということでまずは`amazon cli`のインストールからしていきます。

- [AWS CLIのインストール、更新、およびアンインストール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)

- [AWS CLI の パス を通す](https://qiita.com/plum_shiga/items/5214510f9786898c987f)
***AWSのPATHを通す方法はこちらの記事を参考にさせていただきました。***

> 3.エラーが変わらず出ていたので、権限がないというのはどういうことか現状把握

そもそもIAMユーザーの認証情報を使って、DockerホストからEC2インスタンスを作成しようとしています。そのため、認証情報の記述に問題があるのではないか？と考えました。

そこでまず、環境変数を疑いました。

### 以前にAWS IAMのアクセスキーを環境変数にいれていた。

今回別のIAMユーザーのアクセスキーを扱っています。ところが、前回作成したIAMユーザーのアクセスキーを環境変数に入れてPATHを通している状態でした。そのIAMには権限を与えていないので`UnauthorizedOperation`と警告されているのかなと思いました。
そのため、前回のIAMユーザーのアクセスキー(環境変数)を一度削除しました。ディレクトリごとに、PATHを通す方法のほうが良いかと思いますが、今回は削除いたしました。

以下の記述で設定した環境変数を削除しました。***※お使いのPCのバージョンにより設定方法が異なるかもしれません。***

```terminal:ターミナル
 vim ~/.zshrc
```
`i`でインサートモード（記述できる）に変える。変更を加えたら`esc`、`:wq`、`Enter`で完了。<br>
これだとまだPATHが反映されていないので、下記を実行。

```terminal:ターミナル
source ~/.zshrc
```

###これでDockerホストからEC2インスタンスを作成できる！と思いきや、別のエラーが。

別のエラーが出ましたが、エラーが変わったのを見ると、やはり権限がないIAM（前回作成したIAM）からEC2インスタンスを作成しようとしていたみたいです。

***別のエラーというのはファイルの記述が間違っているというエラーでした。***（ ターミナルのエラーをメモし忘れました。。）
そのため以下`~/.aws.credentials`ファイルの修正。

```vim:修正前
[default]
aws_access_key = <認証キー>
aws_secret_access_key = <認証キー>
```

```vim:修正後
[default]
aws_access_key_id = <認証キー>
aws_secret_access_key = <認証キー>
```

`~/.aws.credentials`ファイルを確認。
を作成したときに自動的にファイル内に記述された型をよく見てみると、`aws_access_key`の`_id`が抜けておりました。
自動生成された型だったので、安心していましたがそんなことはないみたいです。

コード修正後再度、EC2インスタンスの作成を実行。

***DockerホストからのEC2インスタンスの作成を成功しました！！***

## 結論

今回はエラーの原因が一つではなかったので、仮説を立て最善なものを選び検証していくしかないのかなと思いました。エラーが起きたときは自分の理解できていない部分が浮き彫りになっていくので、ものすごく勉強になります。今回で言えば、環境変数やAWS、Linuxについても理解が足りていないなと強く感じました。エラーが起きたらそれに関連することも調べなければ解決できないので、エラーが起きてもポジティブに対処していくことで今後に応用していきます。

## まとめ

- エラーが起きた時原因が一つとは限らない。
- 仮説を立て検証し最善なものを1つ１つエラーを解決していく。
- 自動生成されたものでも疑う目をもつ（特に環境構築やセキュリティーに関わるところ）。


## 参考文献

この記事は以下の情報を参考にして執筆しました。

- [EC2 インスタンスを起動しようとすると、「この操作を実行する権限がありません」というエラーメッセージが表示されるのはなぜですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-not-auth-launch/)

- [AWS CLIのインストール、更新、およびアンインストール](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)

- [AWS CLI の パス を通す](https://qiita.com/plum_shiga/items/5214510f9786898c987f)