SSM AutomationでEC2のIAM Role Policyを承認後に変更する

# SSM AutomationでEC2のIAM Role Policyを承認後に変更する

## 概要

SSM Automationの機能を使ってEC2のIAM Role Policyを変更する
その際に複数人からの承認があって初めて変更できるというフローにしたい

ユースケースとしては、AWS Systems Manager Session Managerを実行する権限を一時的につけたいなど

## 作業の流れ

- EC2インスタンスにIAM RoleをAttachする
- SSM AutomationでAttachするIAM Policyを作成する
- SSM AutomationのYAMLを書く

## 作業

### EC2インスタンスにIAM RoleをAttachする

インスタンスの作り方は省略

#### IAM RoleとInstance Profileの作成

```bash
$ ROLE_AND_PROFILE_NAME=ssm-automation-test-role
$ ASSUME_ROLE_POLICY_DOCUMENT=$(cat << EOS
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOS
)
$ aws iam create-role \
  --role-name "${ROLE_AND_PROFILE_NAME}" \
  --assume-role-policy-document "${ASSUME_ROLE_POLICY_DOCUMENT}"
$ aws iam create-instance-profile \
  --instance-profile-name "${ROLE_AND_PROFILE_NAME}"
```

あとは作ったインスタンスにAttach

### SSM AutomationでAttachするIAM Policyを作成する

```
$ POLICY_NAME=ssm-automation-test-policy
$ POLICY_JSON=$(cat << EOS
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}
EOS
)
$ aws iam create-policy \
  --policy-name "${POLICY_NAME}" \
  --policy-document "${POLICY_JSON}"
```

### SSM AutomationのYAMLを書く

#### SSM Automationでやっていることの流れ

1. 1人以上に承認もらえれば次のステップに行ける
2. AWSのAPIを叩いてIAM PolicyをIAM RoleにAttachする
3. 1人以上に承認もらえれば次のステップに行ける
4. AWSのAPIを叩いてIAM PolicyをIAM RoleにDetachする

途中で承認もらえなかった場合はそのステップでAutomationは終了する

#### 作業内容

```
$ NOTIFICATION_ARN=[SNSのTopic ARNなど]
$ AWS_ACCOUNT_ID=[自分のAWSのアカウントID]
$ APPROVERS=[承認者のIAM User ARNだったり、IAM GroupのARN]
$ DOCUMENT_CONTENT=$(cat << EOS
---
schemaVersion: "0.3"
description: "Automation Document Example YAML"
mainSteps:
- name: approve_attach
  action: aws:approve
  timeoutSeconds: 1000
  onFailure: Abort
  inputs:
    NotificationArn: "${NOTIFICATION_ARN}"
    Message: "EC2にec2:DescribeInstancesの権限を一時的につけたいです。"
    MinRequiredApprovals: 1
    Approvers:
      - "${APPROVERS}"
- name: attach_policy
  action: aws:executeAwsApi
  inputs:
    Service: iam
    Api: AttachRolePolicy
    RoleName: "ssm-automation-test"
    PolicyArn: "arn:aws:iam::${AWS_ACCOUNT_ID}:policy/ssm-automation-test-policy"
- name: approve_detach
  action: aws:approve
  timeoutSeconds: 1000
  onFailure: Abort
  inputs:
    NotificationArn: "${NOTIFICATION_ARN}"
    Message: "EC2のec2:DescribeInstancesの権限を外したいです。"
    MinRequiredApprovals: 1
    Approvers:
      - "${APPROVERS}"
- name: detach_policy
  action: aws:executeAwsApi
  onFailure: Continue
  inputs:
    Service: iam
    Api: DetachRolePolicy
    RoleName: "ssm-automation-test"
    PolicyArn: "arn:aws:iam::${AWS_ACCOUNT_ID}:policy/ssm-automation-test-policy"
EOS
)
$ aws ssm create-document \
    --content "${DOCUMENT_CONTENT}" \
    --document-type "Automation" \
    --name "attach-policy" \
    --document-format "YAML"
```

## 動作確認

NOTIFICATION_ARNで設定した箇所にメールなり通知が届いているので内容を確認する

Approveすれば次のステップに進むし、Rejectすればそこで作業は止まる

IAM Roleの状態を見ながらステップを進めていくと良い

### メールの場合の内容
![mail.png](https://qiita-image-store.s3.amazonaws.com/0/53224/655082f2-4df9-f568-22ad-3422285e6cb7.png)