RAMの作成

AlibabaCloudの基本プロダクトサービスであるResource Access Managementの作成方法を解説します。

1. RAM権限管理

  AlibabaCloudはどのサービスを利用・操作するにしろ権限が必要です。 Terraformで作成したリソースサービスにも他ユーザが操作できるように権限アタッチが必要になります。   本章では、AlibabaCloudサービスに対する権限付与の方法を学びます。


2. Alibaba CloudのRAMについて

  RAM(Resource Access Management)はユーザーID の管理とアクセス制御、権限管理のためのサービスです。RAMを使用することで、ユーザーアカウント (従業員、システム、アプリケーションなど) を作成および管理し、Alibaba Cloud アカウントのリソースに対してそのユーザーアカウントが所有する操作権限を制御できます。Terraformによるリソースを実行するときはRAMで実行権限が必須です。


3. RAMロールとRAMユーザーの違い

  graph LR;
  A("ポリシーサービスに<br>対する権限")-.->B("RAMポリシーを<br>ロールにアタッチ")
  A("ポリシーサービスに<br>対する権限")-.->C("RAMポリシーを<br>ユーザにアタッチ")        
  B("RAMポリシーを<br>ロールにアタッチ")-.->D("ロール(役割)")
  C("RAMポリシーを<br>ユーザにアタッチ")-.->E("ユーザ(人)")
  D("ロール(役割)")-.->F("ロール(役割)を<br>エンティティ(ECSインスタンスなど)にアタッチ")
  A("ポリシーサービスに<br>対する権限")-.->G("RAMポリシーを<br>グループにアタッチ")
  G("RAMポリシーを<br>グループにアタッチ")-.->H("グループ(ユーザの集まり)")

  RAMロールは権限が付与された実際のユーザーが引き受ける必要があります。ロールを引き受けると実際のユーザーはこのRAMロールの一時セキュリティトークンを受け取ります。これにより、この一時セキュリティトークンを使用して、ロールに許可されているリソースにアクセスできます。

  普段の利用時はRAMユーザで管理・運用していくのがベストプラクティスですが、Terraform利用時は基本的にAdministratorAccessが必要となります。

4. ポリシー

  権限はポリシーで定義します。ポリシーでは「実行可能なアクション」や「操作可能なリソース」を指定でき、柔軟に権限が設定できます。

5. ポリシードキュメント

  ポリシードキュメントはJSON形式で管理しており、以下のようにまとめます。 ▼JSON 形式のポリシードキュメント

{
  "Statement": [
    {
      "Action": "*",
      "Effect": "Allow",
      "Resource": "*"
    }
  ],
  "Version": "1"
}

ポリシードキュメントでは、次のような要素を記述します。 * Effect - 許可する場合はAllow、許可しない場合はDeny * Resource - AlibabaCloudの操作可能なリソース・許可されたオブジェクトはなにかを指定します。たとえば ”ユーザAがリソースSampleBucketに対してGetBucket操作を実行できる” という権限付与ポリシーの場合、ResourceはSampleBucket です。 * Action - AlibabaCloudの各種サービスでどんな操作が実行できるか。サービスを個別指定することも可能。たとえば ”ユーザAがリソースSampleBucketに対してGetBucket操作を実行できる” という権限付与ポリシーの場合、ActionはGetBucket です。 * Condition - 権限付与が有効になる条件です。たとえば、”ユーザAが2018年12月31日より前にリソース SampleBucketに対してGetBucket操作を実行できる” という権限付与ポリシーの場合、Conditionは 2018年12月31日より前 です。

他の例もみてみましょう。 ”リクエスト送信者のソースIPアドレスが 42.160.1.0であれば、SampleBucketというOSSバケットに対して読み取り専用操作を実行できる” というRAMポリシーであれば、以下リスト のようにまとめます。 ▼JSON 形式のポリシードキュメント

{
    "Version": "1",
    "Statement":
    [{
        "Effect": "Allow",
        "Action": ["oss:List*", "oss:Get*"],
        "Resource": ["acs:oss:*:*:samplebucket", "acs:oss:*:*:samplebucket/*"],
        "Condition":
        {
            "IpAddress":
            {
                "acs:SourceIp": "42.160.1.0"
            }
        }
    }]
}

6. RAM ポリシー

  ポリシードキュメントを保持するリソースが「RAM ポリシー」です。リストのように、ポリシー名とポリシードキュメントを設定します。

▼リスト RAM ポリシーの定義

resource "alicloud_ram_policy" "terraform_example" {
   name   = "terraform_example"
   policy = data.alicloud_ram_policy_document.allow_describe_regions.json
}

7. RAM ポリシーの作成

  ここまではRAMポリシーの基本的なことを記載しました。それではTerraformによるRAMポリシーの作成をします。 例として、以下リストのように test_policy というRAMポリシー名で、mybucket というOSSバケットに対して読み取り専用操作を実行できるという権限ルールを新しく作成します。

▼リスト test_policy RAM ポリシーの定義

resource "alicloud_ram_policy" "policy" {
  name = "test_policy"
  statement = [
    {
      effect = "Allow"
      action = [
        "oss:ListObjects",
        "oss:GetObject"
      ]
      resource = [
        "acs:oss:*:*:mybucket",
        "acs:oss:*:*:mybucket/*"
      ]
    }
  ]
  description = "this is a policy test"
  force = true
}

上記で記載したRAMポリシー以外にオプション(任意)で他ルールらパラメータや構成を指定することもできます。

このリソースを実行することにより、以下の属性情報が出力されます。

その他、詳しくはAliCloudのterraform-RAMを参照してみてください。

8. RAMロールを作成し、RAMポリシーへアタッチ

  今度は別のパターン、RAMロールを作成し、RAMポリシーへアタッチしてみます。 例として、test_roleというRAMロールを作成し、これをtest_policyというRAMポリシーへアタッチします。 アタッチするときはalicloud_ram_role_policy_attachmentという構文を使います。

resource "alicloud_ram_role" "role" {
  name = "test_role"
  ram_users = ["acs:ram::${your_account_id}:root", "acs:ram::${other_account_id}:user/username"]
  services = ["apigateway.aliyuncs.com", "ecs.aliyuncs.com"]
  description = "this is a role test."
  force = true
}


resource "alicloud_ram_policy" "policy" {
  name = "test_policy"
  statement = [
          {
            effect = "Allow"
            action = [
              "oss:ListObjects",
              "oss:GetObject"]
            resource = [
              "acs:oss:*:*:mybucket",
              "acs:oss:*:*:mybucket/*"]
          }]
  description = "this is a policy test"
  force = true
}

resource "alicloud_ram_role_policy_attachment" "attach" {
  policy_name = "${alicloud_ram_policy.policy.name}"
  policy_type = "${alicloud_ram_policy.policy.type}"
  role_name = "${alicloud_ram_role.role.name}"
}

このalicloud_ram_role_policy_attachmentリソースで必要なパラメータは以下3点です。

このリソースを実行することにより、以下の属性情報が出力されます。

その他、詳しくはAliCloudのterraform-RAMポリシーへのアタッチを参照してみてください。

9. RAMポリシーを対象リソース・サービスへアタッチ

  ここまで、RAMポリシーtest_roleを作成したら、今度は対象のリソース・サービスにアタッチしてみます。ここはECS_instanceらECSインスタンスへアタッチしてみます。 アタッチするときはalicloud_ram_role_attachment構文を使います。

resource "alicloud_ram_role" "role" {
  name = "test_role"
  services = ["apigateway.aliyuncs.com", "ecs.aliyuncs.com"]
  ram_users = ["acs:ram::${your_account_id}:root", "acs:ram::${other_account_id}:user/username"]
  description = "this is a role test."
  force = true
}

resource "alicloud_instance" "ECS_instance" {
  instance_name   = "ECS_instance_for_terraform"
  host_name       = "ECS_instance_for_terraform"
  instance_type   = "ecs.n4.small"
  image_id        = "centos_7_04_64_20G_alibase_201701015.vhd"
  system_disk_category = "cloud_efficiency"
  security_groups = ["${alicloud_security_group.sg.id}"]
  availability_zone = "${var.zone}"
  vswitch_id = "${alicloud_vswitch.vsw.id}"
}

resource "alicloud_ram_role_attachment" "attach" {
  role_name = "${alicloud_ram_role.role.name}"
  instance_ids = ["${alicloud_instance.ECS_instance.id}"]
}

ECSアタッチでより詳しくはこちらを参照してみてください。