Toyokky's Tech Notes

ネットワーク系クラウドエンジニアとして学んだことの技術メモ。

CLIだけで構築: 04_IAMロール、IAMポリシー

CLIだけで構築: 04_IAMロール、IAMポリシー

本ページでは CLIだけで構築: 01_まとめ、構成図 へ記載した構成図の以下AWSリソースを、AWS CLIで構築します。

記事番号 リソース種別 VPC AZ 個別情報 Name CIDR, その他
04 IAMロール 本番 - EC2をCW,SSMで管理 P1x-Irl-Mnt-Cw-And-Ssm AmazonEC2RoleforSSM
     CloudWatchAgentAdminPolicy
     CloudWatchAgentServerPolicy
本番 - VPCフローログ用 P1x-Irl-Mnt-Vpcflowlogs -
P1x-Ipl-Mnt-Vpcflowlogs インラインポリシー

自宅のPC環境

  • Windows10 Home Ver21H1
    • AWS CLI: aws-cli/2.1.34 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
      • -- profile default : 読み取り専用
      • -- profile aws_RW : 書き込み権限あり
        • ※ 誤操作防止のため、変更操作時のみ-- profileオプションを付けてます。
    • PowerShell: Ver7.1.4

注意書き

  • コマンド内の変数やパラメータやは検証で使用したものを記載しています。自身の環境に書き換えて使用してください。
  • 個人で検証しているため実行結果に責任は持てません。必ずご自身でも検証してから使用してください。

目次


VPCフローログ用のIAMロール

IAMロールへインラインポリシーとして直接ポリシーを書き込む方法を使用します。
GUIVPCフローログを作成する際、ついでにIAMロールの作成が出来ますが、そちらもインラインポリシーを使用していたと思うので。

IAMをCLIで作業する際、JSONファイルを扱う必要があります。PowerShellでの作成コマンドを記載していますので、事前にファイルを扱うディレクトリを決めて、変数 ${work_dir} で指定してください。
JSONファイルを別途用意する場合は ${json_content} の中身を参考にしてください。

JSONファイルの作成

以下のJSONファイルを作成します。

  • iam_assumerole_vpcflowlogs.json : AssumeRole(信頼されたエンティティ)の設定用
  • iam_policy_vpcflowlogs.json : VPCフローログのインラインポリシー作成用
## AssumeRole: vpc-flow-logs
${json_assume_name} = "iam_assumerole_vpcflowlogs.json"
${work_dir} = "C:\#temp"
${service_type} = "vpc-flow-logs"

${json_content} = @"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "${service_type}.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
"@

# JSONファイルの出力(UTF-8, BOM無しにしたかったので、文字コードをASCIIにしてます。)
Write-Output ${json_content} | Out-File -Encoding ascii ${work_dir}\${json_assume_name}

# -------------------------------------------
## Policy: vpc-flow-logs
${json_policy_name} = "iam_policy_vpcflowlogs.json"
${work_dir} = "C:\#temp"

${json_content} = @"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
"@

# JSONファイルの出力(UTF-8, BOM無しにしたかったので、文字コードをASCIIにしてます。)
Write-Output ${json_content} | Out-File -Encoding ascii ${work_dir}\${json_policy_name}

IAMロールの作成、インラインポリシーの適用

# IAMロールの作成
${profile} = "aws_RW"
${iam_role_name} = "P1x-Irl-Mnt-Vpcflowlogs"
${iam_policy_name} = "P1x-Ipl-Mnt-Vpcflowlogs"
${json_policy_name} = "iam_policy_vpcflowlogs.json"
${work_dir} = "C:\#temp"
${json_assume_name} = "iam_assumerole_vpcflowlogs.json"
${iam_role_description} = "Allows VPCflowlogs to call CloudWatch Logs on your behalf."
${tag_env} = "Product"
${tag_system} = "HatenaBlog"

aws iam create-role `
    --profile ${profile}  `
    --role-name ${iam_role_name} `
    --description ${iam_role_description} `
    --assume-role-policy-document file://${work_dir}\${json_assume_name}

## IAMロールへタグを付与する
aws iam tag-role `
    --profile ${profile}  `
    --role-name ${iam_role_name} `
    --tags "Key=Name,Value=${iam_role_name}" `
            "Key=EMSEnv,Value=${tag_env}" `
            "Key=EMSSystem,Value=${tag_system}"

## IAMロールへインラインポリシーを適用する
aws iam put-role-policy `
    --profile ${profile}  `
    --role-name ${iam_role_name} `
    --policy-name ${iam_policy_name} `
    --policy-document file://${work_dir}\${json_policy_name}


EC2管理用のIAMロール(CloudWatch, SystemsManager)

IAMロールへAWS管理ポリシーを割り当てる方法を使用します。

IAMをCLIで作業する際、JSONファイルを扱う必要があります。PowerShellでの作成コマンドを記載していますので、事前にファイルを扱うディレクトリを決めて、変数 $ { work_dir } で指定してください。
JSONファイルを別途用意する場合は $ { json_content } の中身を参考にしてください。

JSONファイルの作成

以下のJSONファイルを作成します。

  • iam_assumerole_ec2.json : AssumeRole(信頼されたエンティティ)の設定用
## AssumeRole: EC2
${json_assume_name} = "iam_assumerole_ec2.json"
${work_dir} = "C:\#temp"
${service_type} = "ec2"

${json_content} = @"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "${service_type}.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
"@

# JSONファイルの出力(UTF-8, BOM無しにしたかったので、文字コードをASCIIにしてます。)
Write-Output ${json_content} | Out-File -Encoding ascii ${work_dir}\${json_assume_name}

IAMロールの作成、インスタンスプロファイルの作成

# IAMロールの作成
${profile} = "aws_RW"
${iam_role_name} = "P1x-Irl-Mnt-Cw-And-Ssm"
${work_dir} = "C:\#temp"
${json_assume_name} = "iam_assumerole_ec2.json"
${iam_role_description} = "Allows EC2 to call CloudWatch and SystemsManager on your behalf."
${tag_env} = "Product"
${tag_system} = "HatenaBlog"

aws iam create-role `
    --profile ${profile}  `
    --role-name ${iam_role_name} `
    --description ${iam_role_description} `
    --assume-role-policy-document file://${work_dir}\${json_assume_name}

## IAMロールへタグを付与する
aws iam tag-role `
    --profile ${profile}  `
    --role-name ${iam_role_name} `
    --tags "Key=Name,Value=${iam_role_name}" `
    "Key=EMSEnv,Value=${tag_env}" `
    "Key=EMSSystem,Value=${tag_system}"

## IAMロールへポリシーをアタッチする
aws iam attach-role-policy `
    --profile ${profile} `
    --role-name ${iam_role_name} `
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM

aws iam attach-role-policy `
    --profile ${profile} `
    --role-name ${iam_role_name} `
    --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentAdminPolicy

aws iam attach-role-policy `
    --profile ${profile} `
    --role-name ${iam_role_name} `
    --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

## インスタンスプロファイルの作成
## ※GUIでは意識して作成しないが、EC2等からIAMロールが見えるようにする設定で、CLI作業では作成が必要。インスタンスプロファイル名はIAMロールの名前を流用で大丈夫です。
aws iam create-instance-profile `
    --profile ${profile}  `
    --instance-profile-name ${iam_role_name}

## IIAMロールとインスタンスプロファイルをアタッチする
aws iam add-role-to-instance-profile `
    --profile ${profile}  `
    --role-name ${iam_role_name} `
    --instance-profile-name ${iam_role_name}


作成したAWSリソースの表示

# IAMロール
## すべて表示する
aws iam list-roles

## 名前を指定して表示
${iam_role_name} = "P1x-Irl-Mnt-Cw-And-Ssm"

aws iam get-role `
    --role-name ${iam_role_name}

## IAMロールにアタッチされているIAMポリシーを表示
aws iam list-attached-role-policies `
    --role-name ${iam_role_name}


# -------------------------------------------
# インスタンスプロファイル
## すべて表示する
aws iam list-instance-profiles

## 名前を指定して表示
${iam_role_name} = "P1x-Irl-Mnt-Cw-And-Ssm"

aws iam get-instance-profile `
    --instance-profile-name ${iam_role_name}


関連記事へのリンク