AWS Systems Manager(SSM) パラメータストアのクロスアカウント設定

Bのアカウントに存在するパラメータストアをAのアカウントから参照するための設定について確認した記事です。

# 構成

- Aアカウント
    - パラメータストアの値にアクセスする方のアカウント
    - アカウントIDを仮に0123456789012とする

- Bアカウント
    - パラメータストアに値を保管しているアカウント
    - アカウントIDを210987654321とする

## アカウントBでパラメータストアに値を保管する

![スクリーンショット_2021-09-07_10_45_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52141/a9d1d136-b6c3-8fbd-2132-54a2ebbe4f2a.png)

設定値としては画像の通り
- キー名：cross-test
- 種類：String
- 値：test

## アカウントBでパラメータストアアクセスするロールを作成する(671268391729)

```:パラメータストアのARN形式
arn:aws:ssm:REGION:ACCOUNT-ID:parameter/ID:parameter-name
```

作成したパラメータを取得できるPolicyを作成します。

```json:policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeParameters"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters",
                "ssm:GetParameter"
            ],
            "Resource": "arn:aws:ssm:ap-northeast-1:210987654321:parameter/cross-test"
        }
    ]
}

```

上記Policyをセットしたロール`testBRole`を作成します。
信頼関係Policyは下記のようにAアカウントを指定しましょう。
アカウントAからこのロールをAssumeして使用したいからです。


```json:policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::0123456789012:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}
```

## アカウントAでIAMのRoleを準備する

Bアカウントで用意したロールをAssumeするためのロールを作成します。ロール名は`AssumeTestBRole`とします。
まずはPolicyの準備

```json:policy
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::210987654321:role/testBRole"
  }
}
```

Resourceには先程作成したアカウントBの`testBrole`を指定します。

今回はテストでアカウントAのユーザーでクラウドシェルからCLIを叩きたいので、このロールの信頼関係ポリシはAアカウント全体として指定しました。

```json:policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::0123456789012:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}
```


# テスト
アカウントAで上記ロールを用いてCLI経由でアカウントBのパラメータストアの値を取得する

AWS CloudShellを利用しました。
まず、testBroleをAssumeしたいのでAssumeTestBRoleにAssumeします。

```
aws sts assume-role \
    --role-arn "arn:aws:iam::0123456789012:role/AssumeTestBRole" \
     --role-session-name test-AssumeTestBRole-Session
```

出力された一時クレデンシャル情報を環境変数に指定してtestBroleにAssumeできるようにします。
続いて、testBroleにAssumeします。

```
aws sts assume-role \
    --role-arn "arn:aws:iam::210987654321:role/testBRole" \
     --role-session-name testBRole-Session
```

この状態でAssumeした主体が保持している権限は一番最初に作成したBアカウントのパラメータを参照するための権限になります。

```json:policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeParameters"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameters",
                "ssm:GetParameter"
            ],
            "Resource": "arn:aws:ssm:ap-northeast-1:210987654321:parameter/cross-test"
        }
    ]
}

```

一番最初のコレですね。
したがって、parametersやparameterが使えます。

```
aws ssm get-parameters \
    --names cross-test \
    --query "Parameters[*].{Name:Name,Value:Value}"
```

```
[
    {
        "Name": "cross-test",
        "Value": "test"
    }
]
```