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_PROFILE や AWS_ACCESS_KEY_ID、AWS_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になります。
この記事が気に入ったらサポートをしてみませんか?