IAMのAssumeRoleについて

AssumeRole

権限を移譲するための仕組みのようです。

参考

christina04.hatenablog.com

qiita.com

概要

今回は、アカウントAのAWSリソースを、アカウントBが使うというケースをAssumeRoleでやります

例として、以下のアカウントIDだとします。
- アカウントA
210987654321
- アカウントB
123456789012

つまり、アカウントAが権限を付与する方で、アカウントBが権限を要求する立場です。

権限を付与するアカウント(210987654321)での作業

ロールを作るだけ

AWSのコンソールからIAMを選択
ロールを作成します

そのロール作成の際に、「別のAWSアカウント」を選びます
f:id:y-ni-shi:20200320204154p:plain

次に権限の画面になりますが、任意の権限を選びます
今回アドミン権限にしますが、本来は用途に絞った権限を選択すべきです
f:id:y-ni-shi:20200320204330p:plain

ロールの名前を決めて保存します。
今回はAssumeRoleSampleとしました f:id:y-ni-shi:20200320204430p:plain

権限を以来するアカウント(123456789012)での作業

任意のユーザーを作ります
権限はデフォルトの状態でOKです

任意のグループを作ります。
権限はとりあえずデフォルトの状態でOKです

今回はこの作成したグループにAssumeRoleの権限を付与します

ポリシーの作成

アカウントAに対して権限を移譲してほしいと依頼するわけですが、
その「移譲を依頼する」という権限をつけないといけないぽいです

ポリシーの作成から

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::123456789012:role/AssumeRoleSample"
        }
    ]
}

"arn:aws:iam::123456789012:role/AssumeRoleSample"これがキモです。
アカウントAのIDと、ロール名称を指定します。

そしてこのポリシーを保存。
(AssumeRoleSampleという名前でポリシーを保存.名前は任意です)

そしてこのポリシーをグループにアタッチ
f:id:y-ni-shi:20200320205102p:plain

これで準備完了。

terraform

terraformで実験

terraform {
  required_version = "0.12.24"
}

variable "assume_role" { 
}

provider "aws" {
  region     = "ap-northeast-1"
  assume_role {
    role_arn     = var.assume_role
  }
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support = true
  tags = {
    Name = "vpc for test"
  }
}

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.main.id
  tags = {
    Name = "igw for test"
  }
}

さらに、環境変数を注入して実行します
terraform.tfvars

assume_role = "arn:aws:iam::123456789012:role/AssumeRoleSample"

アクセスキーとIDの環境変数への登録(上記tsvarsでやってもいいけど)

export AWS_ACCESS_KEY_ID=access id
export AWS_SECRET_ACCESS_KEY=access key

このアクセスIDとKEYはアカウントBの情報です。
アカウントBとしてログインしてアカウントAに移譲を依頼。

terraform plan -var-file="terraform.tfvars"

問題なければ

terraform apply -var-file="terraform.tfvars"

これで実行するとAWSリソースができているはず。
アカウントAのコンソールにログインしてVPCができていることを確認。

お片付け

terraform destroy -var-file="terraform.tfvars"