Switch Roleで別アカウントのCloudWatch Logsを参照する


# 前提
下記のような環境である前提。

* 本番環境と開発環境でAWSアカウントを分けている
* 本番環境用AWSアカウントではCloudWatch Logsに各種ログを出力している
* 開発者は本番環境用AWSアカウントへのアクセス権限はない

開発者に本番環境のCloudWatch Logsへの参照権限を与えたい。Swich Roleを使って。

# 手順

本番環境用アカウントでの作業は `本` 。
開発環境用アカウントでの作業は `開` 。

## `本` IAMロールの作成

IAMコンソールを開き、Role > [Create New Role] を押下。

作成するロール名を入力。ここでは `view-prod-cloudwatch-logs` にした。
Role for Cross-Account Access > Provide access between AWS accounts you own を選択。

このロールにスイッチするAWSアカウントIDを入力(開発環境のID)。
MFAを強制してみる。

Select Policy Template > CloudWatch Logs Read Only Access を選択。

```json:view-prod-cloudwatch-logs
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:Describe*",
        "logs:Get*",
        "logs:TestMetricFilter"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

確認画面で [Create Role] を押下で作成完了。

次工程で作成したIAMロールの Role ARN を使うのでコピーしておく。
ちなみにIAMロールの trust policy はこんな感じになってた。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::XXXXXXXXXXXX:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Null": {
          "aws:MultiFactorAuthAge": false
        }
      }
    }
  ]
}
```

https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-creatingrole-user.html

## `開` IAMロールの使用許可

IAMコンソールを開き、User > ロールの切り替えを行うユーザ/グループを選択。
[Attach User/Group Policy] > Custom Policy を選択。

下記のポリシーを貼り付ける。
Resource部分は前工程で作成したIAMロールのARNに変更すること。

```json:ViewProdCloudWatchLogs
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": ["sts:AssumeRole"],
    "Resource": "arn:aws:iam::XXXXXXXXXXXX:role/view-prod-cloudwatch-logs"
  }]
}
```

https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-usingrole-configuringuser.html

## `開` Switch Role

右上のアカウントメニューから Switch Role を選択。

初回はロールの切り替えを押下。

アカウント欄にAWSアカウントIDかエイリアスを入力、ロール欄にIAMロール名を入力しロールの切り替えを押下。
切り替え後のヘッダーに表示されるアカウント名の表示名と表示色を選択できる。

切り替え後、CloudWatchコンソールのLogsだけ参照可能になっているはず。
一度切り替えるとアカウントメニューのRole Historyに記録されるので、次回以降はメニューから選択するだけで切り替えられる。

https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-switchingatconsole-user.html

# その他

## リンク

新しいロールを作ったら使用者にはリンクを渡すのが楽。
ログインした状態でリンク先に遷移するとロールの切り替え画面が表示される。

```html
https://signin.aws.amazon.com/switchrole?account=<YourAccoIDorAliasHere>&roleName=<YourRoleNameHere>
```

## MFA

切り替え時にワンタイムパスワードの入力は要求されなかった。
MFAの設定は無視されるのか、元々MFAで認証したユーザだから切り替えできたのかは分からない。

## CloudTrail

ロールの切り替え時の監査ログはこんな感じで出力される。
抜ける時の eventName は ExitRole だった。

```json
{
    :
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "XXX...:user-name",
    "arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/view-prod-cloudwatch-logs/user-name",
    "accountId": "XXXXXXXXXXXX"
  },
    :
  "eventName": "SwitchRole",
    :
  "additionalEventData": {
    "RedirectTo": "https://ap-northeast-1.console.aws.amazon.com/console/home?region=ap-northeast-1",
    "SwitchFrom": "arn:aws:iam::XXXXXXXXXXXX:user/user-name"
  }
    :
}
```

その後の操作ログはこんな感じ。

```json
{
    :
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "XXX...:user-name",
    "arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/view-prod-cloudwatch-logs/user-name",
    "accountId": "XXXXXXXXXXXX",
    "accessKeyId": "XXX...",
    "sessionContext": {
      "attributes": {
        "mfaAuthenticated": "true",
        "creationDate": "2015-01-07T08:28:32Z"
      },
      "sessionIssuer": {
        "type": "Role",
        "principalId": "XXX...",
        "arn": "arn:aws:iam::XXXXXXXXXXXX:role/view-prod-cloudwatch-logs",
        "accountId": "XXXXXXXXXXXX",
        "userName": "view-prod-cloudwatch-logs"
      }
    }
  },
    :
}
```