見出し画像

AWSでクロスアカウントの問題の発生


1. 問題点

クロスアカウントの問題が発生した場合、AWS上で異なるアカウント間でリソースを管理する必要があります。
以下は、TerraformとAnsibleを使用して異なるAWSアカウント間でクロスアカウントアクセスを設定するための基本的な手順です。

2. Terraformの対応

2.1. Providerの設定

Terraformで異なるアカウント間でのリソースを管理するには、provider ブロック内で assume_role 設定を使用します。これにより、異なるアカウントのロールを前提条件として、クロスアカウントのアクセスが可能になります。

provider "aws" {
  region = "us-west-2"
  assume_role {
    role_arn = "arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME"
  }
}


2.2. データソースとリソースの設定

クロスアカウントのデータソースやリソースを作成する場合、provider ブロック内で assume_role 設定を使用することで、必要なアクセスを確立します。

data "aws_iam_policy_document" "example" {
  source_json = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Action = "sts:AssumeRole",
      Effect = "Allow",
      Principal = {
        AWS = "arn:aws:iam::ACCOUNT_ID:root"
      }
    }]
  })
}

2.2.Terraform実行時の認証情報

AWS_PROFILEAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY を環境変数として設定するか、~/.aws/credentials ファイルでクロスアカウントのロールを指定します。

2.3.具体例

provider "aws" {
  region = "us-west-2"
  assume_role {
    role_arn = "arn:aws:iam::TARGET_ACCOUNT_ID:role/TARGET_ROLE_NAME"
  }
}

resource "aws_s3_bucket" "example_bucket" {
  bucket = "example-bucket"
  acl    = "private"
}

この例では、aws プロバイダーの assume_role 設定を使用して、異なるアカウント(TARGET_ACCOUNT_ID)のロール(TARGET_ROLE_NAME)を前提条件として指定しています。S3バケットのリソースが異なるアカウントに作成されます。

3.Ansibleの対応

3.1.SSMパラメータストアを利用

クロスアカウントでのシークレット管理には、SSM パラメータストアを使用することが一般的です。Ansibleの aws_ssm モジュールを使用して、異なるアカウントのパラメータにアクセスします。

- name: Get parameter from SSM in another account
  aws_ssm:
    name: /path/to/parameter
    region: us-west-2
    profile: cross-account-profile
  register: parameter_value

3.2.Ansibleのロールまたはタスク内でIAMロールを前提条件として指定

クロスアカウントのアクセスを行う場合、IAMロールの前提条件を指定します。これにより、Ansibleが異なるアカウント内のEC2インスタンスに対して必要な権限を取得できます。

- name: Assume role in another account
  iam_assume_role:
    role_arn: arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME
    profile: cross-account-profile
  become: yes
  become_method: assume_role

3.3.具体例

---
- name: Deploy application
  hosts: ec2_instance_in_target_account
  gather_facts: true
  tasks:
    - name: Assume role in another account
      iam_assume_role:
        role_arn: arn:aws:iam::TARGET_ACCOUNT_ID:role/TARGET_ROLE_NAME
        profile: cross-account-profile
      become: true
      become_method: assume_role

    - name: Get secret from SSM parameter store in another account
      aws_ssm:
        name: /path/to/parameter
        region: us-west-2
        profile: cross-account-profile
      register: secret_parameter

    - name: Generate and deploy configuration file
      template:
        src: templates/config_template.j2
        dest: /path/to/config/file
      vars:
        secret_value: "{{ secret_parameter.parameter.value }}"

このAnsibleの例では、iam_assume_role モジュールを使用して異なるアカウントのロールを前提条件として指定しています。また、aws_ssm モジュールを使用して異なるアカウントのSSMパラメータストアからシークレットを取得しています。最後に、template モジュールを使用して設定ファイルを生成し、目的のインスタンスにデプロイします。

これらの手順により、TerraformとAnsibleを使用して異なるAWSアカウント間でのリソース管理とクロスアカウントアクセスを実現できます。

※ "TARGET_ACCOUNT_ID" と "TARGET_ROLE_NAME" とは単なる置換文字列で、実際の環境に合わせて指定する必要があります。
具体的には、異なるアカウントで使用するIAMロールのARNになります。


この記事が気に入ったらサポートをしてみませんか?