Dev AWSome Day 2018の復習①　～AWS IAM編～

2018年10月30日（火）に開催されたAWSのイベント「[Dev AWSome Day 2018](https://aws.amazon.com/jp/aws-devday-tokyo-2018/dev-awsomeday/)」に参加してきましたので、忘れないように復習してみます。
なお、宣伝チックなお話とか、本筋とは関係ないお話は全てカットします。

※当日時間が足らなくて、ほとんど写経状態だったので、じっくりと取り組んでみます

# 準備
AWSでサービスを起動したり設定したりするためには、以下の3つの方法があります。

- マネージメントコンソールから操作する（その先でAPIを呼び出している）
- AWS CLIからAPIを呼び出す
- AWS SDKsからAPIを呼び出す

今回は使い勝手がよく、プログラムを組まなくてもよく、自動化に展開できる「AWS CLI」を使用します。

ハンズオン中では「Cloud9」からAWS CLIを実行していましたが、もったいないお化けが出てしまいますので、この復習ではローカルなPCにAWS CLIをインストールして実行します。
インストールの仕方は[こちら](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/installing.html)を参考にしてください。

# IAM（Identity and Access Management）のお話
アクセス管理には「認証」と「認可」の設定が必要となります。

- 認証（IAMユーザ）
    - 誰がそのAPIを呼び出したのかを確認する
    - 認証情報（ユーザ名／パスワード）を提示することで確認する
- 認可（IAMポリシー）
    - APIを呼び出した人（もしくはプログラム）が、そのAPIを実行できる権限を持っているかを確認する
    - 以下の2つの観点でアクセスできるかをチェックする
        - どのリソースに対して
        - どのような操作（＝APIコール）

## 認証（IAMユーザ）
「IAMユーザ名」と「パスワード」を登録します。
以降、マネージメントコンソールへは「IAMユーザ名」と「パスワード」で認証されます。
AWS CLIとAWS SDKsは「アクセスキー」で認証されます。
「アクセスキー」は「アクセスキーID」と「シークレットアクセスキー」で構成されます。

## 認可（IAMポリシー）
権限を記述しているJSONのドキュメントになります。
IAMポリシーはIAMユーザ、IAMグループ、IAMロールに割り当てられます。

## IAMロール
IAMロールに認証情報はなく、IAMユーザ、アプリケーション、サービスがIAMロールを引き受けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/297160fb-e48a-45bc-c5ca-c4cf9944c39d.png)

# 実際に試してみる
## IAMポリシーの作成

1. マネージメントコンソールを開く
2. 「IAM」を選択<br/>![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/09e894cc-a6a5-c032-e248-fe269ece6fb8.png)
3. 「ポリシー」を選択
4. 「ポリシーの作成」ボタンをクリック
5. 「JSON」タブをクリック
6. JSON形式で権限を設定
7. 「Review policy」ボタンをクリック
8. IAMポリシーの「名前」を入力
9. 「Create policy」ボタンをクリック

権限のJSONの例は、こんな感じです。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DevAWSomePolicy01",
            "Effect": "Allow",
            "Action": [
                "sns:*",
                "application-autoscaling:*",
                "tag:GetResources",
                "cognito-identity:*",
                "s3:*",
                "apigateway:*",
                "logs:*",
                "cloudformation:*",
                "dynamodb:*",
                "cloud9:*",
                "rekognition:*",
                "cognito-sync:*",
                "iam:*",
                "cloudwatch:*",
                "lambda:*",
                "ec2:*",
                "cognito-idp:*"
            ],
            "Resource": "*"
        }
    ]
}
```

## IAMユーザの作成

1. マネージメントコンソールを開く
2. 「IAM」を選択
3. 「ユーザー」を選択
4. 「ユーザーを追加」ボタンをクリック
5. ユーザー詳細の設定で以下を入力
    - ユーザー名
    - アクセスの種類<br/>※「プログラムによるアクセス」と「AWS マネジメントコンソールへのアクセス」の両方をチェック
    - コンソールのパスワード<br/>※「カスタムパスワード」を選択して、パスワードを設定
    - パスワードのリセットが必要<br/>※チェックを外す
6. 「次のステップ：アクセス権限」ボタンをクリック
7. 「既存のポリシーを直接アタッチ」をクリック
8. 作成したIAMポリシーをチェックし、「次のステップ：確認」ボタンをクリック
9. 「ユーザーの作成」ボタンをクリック
10. 表示されているURLを保存（IAMユーザでサインインするときに使用します）
11. 「.csv のダウンロード」ボタンをクリックし、ローカルにCSVファイルをダウンロードします<br/>ここにアクセスキーIDとシークレットアクセスキーが設定されています
12. 「閉じる」ボタンをクリック

## サインインの確認
保存したURLでサインインしてみます。
以降の作業は、作成したIAMユーザで行います。

## プログラムへの認可（その1）
新しくEC2を立ち上げてみます。
そこで

```text
> aws configure
```

を実行し、IAMユーザのアクセスキーIDとシークレットアクセスキーを設定します。
（つまりIAMユーザに割り当てられたIAMポリシーの設定内容でアクセスするということ）

```text
AWS Access Key ID [None]: AKIAI7K4HXXXXXXXXXXX
AWS Secret Access Key [None]:  Is9vUlrXXXXXXX+/zIWfuPXXXXXXXXXXX
Default region name [None]:  us-west-2
Default output format [None]:
```

設定したアクセスキーIDとシークレットアクセスキーは「~/.aws/credentials」ファイルに保存されます。

以降、このインスタンス上のプログラム（AWS SDKsを使用）からサービスへのアクセスが可能になります。
例えばPythonで、以下のようなコードを実行してみます。

```python
import boto3
client = boto3.client('ec2')
client.describe_instances()
```

するとこんな感じの出力になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/d8b347a7-8353-cf59-b38a-6baa409d631d.png)

## プログラムへの認可（その2）
IAMロールを作成し、そこにポリシーを設定して、サービスに設定する方法もあります。
先に、「~/.aws/credentials」ファイルを削除しておきます。

```text
> rm ~/.aws/credentials
```

### IAMロールの作成

1. マネージメントコンソールを開く
2. 「IAM」を選択
3. 「ロール」を選択
4. 「ロールの作成」ボタンをクリック
5. 今回は「EC2」を選択し、「次のステップ: アクセス権限」ボタンをクリック
6. 「AmazonEC2ReadOnlyAccess」にチェックして、「次のステップ:確認」ボタンをクリック<br/>※もちろん、自分で作成したIAMポリシーを選択しても良い
7. 「ロール名」を入力し、「ロールの作成」ボタンをクリック

作成したら、先程起動したEC2にIAMをロールを割り当てます。
（ここでは、前に作成したIAMポリシーではなく、IAMロールに設定したアクセス権限でプログラムがアクセスできるようになります）

1. マネージメントコンソールを開く
2. 「EC2」を選択
3. 「インスタンス」を選択
4. 先程起動したインスタンスを選択し、右クリック
5. 「インスタンスの設定」－「IAM ロールの割り当て/置換」を選択
6. 「IAMロール」に先ほど作成したIAMロールを選択し、「適用」ボタンをクリック
7. 「閉じる」ボタンをクリック

その後、上と同じPythonのプログラムを実行すると、同じように表示されます。
ただし今度は「~/.aws/credentials」ファイルは作成されていません。

# まとめ
イマイチIAMはわかりにくいのですが、「認証」と「認可」をちゃんと切り分けて考えると、多少は理解しやすくなるような気がします。
また同様に、「IAMユーザ」「IAMポリシー」「IAMロール」が理解できれば良いような気がします。

なお、今回のハンズオンは、この「認証」と「認可」を理解するのが、一番のポイントだったような気がします。