AWS環境では、
別アカウント間でリソースを操作する際に
IAMロールを使って権限を委任することが推奨されます。
本記事では、
AWSアカウントA
(Ruby on RailsのWebサーバがあるアカウント)から、
別のAWSアカウントBのKinesisストリームに
データを書き込むための手順について解説します。
特に、IAMロールを活用して、
クロスアカウントアクセスを
安全に行う方法に焦点を当てています。
クロスアカウントアクセスとは?
AWSでは、複数のアカウントを使って
リソースを管理することが一般的です。
例えば、AWSアカウントAにWebサーバ、
AWSアカウントBにデータストリーム(Kinesis)がある場合、
アカウントAのリソースがアカウントBのリソースに
アクセスする必要があります。
このようなクロスアカウントアクセスを安全に管理するために、
IAMロールとAssumeRoleというメカニズムを利用します。
IAMロールで認証を行う理由
クロスアカウントでリソースにアクセスする場合、
単純にアカウントAに直接Kinesisへの
アクセス権限を与えるのではなく、
IAMロールを使用するのがベストプラクティスです。
これにより、
次のようなメリットがあります:
- セキュリティ強化
必要なときだけ特定の権限を
借りてアクセスするため、
不要なアクセス権限を付与せずに済みます。 - 柔軟性
異なるAWSアカウント間で
権限を柔軟に委任できます。 - 短期間のアクセス
一時的なセッションでアクセスするため、
長期間の認証情報が漏洩するリスクが低減します。
AWSアカウントBでIAMロールを作成する
まずは、Kinesisストリームがある
AWSアカウントBにIAMロールを作成し、
アカウントAがそのロールをAssumeRoleできるように設定します。
ステップ1: IAMロールの作成
AWSアカウントBのIAMコンソールに
アクセスし、以下の設定を行います。
ロールの作成
新しいロールを作成し、
ロールの信頼関係を設定します。
信頼関係では、
アカウントAがこのロールを
引き受けることができるようにします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウントAのID>:root"
},
"Action": "sts:AssumeRole"
}
]
}ステップ2: Kinesisへの書き込み権限を付与
作成したロールに、
Kinesisストリームへの
書き込み権限を付与します。
以下は、
Kinesisへの書き込みに必要なポリシーの例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kinesis:PutRecord",
"kinesis:PutRecords"
],
"Resource": "arn:aws:kinesis:us-east-1:<アカウントBのID>:stream/<KinesisStreamName>"
}
]
}
このポリシーは、
指定されたKinesisストリームに
データを書き込む権限を許可しています。
AWSアカウントAでAssumeRoleを実行する
次に、AWSアカウントAの
Railsアプリケーションから
アカウントBのIAMロールをAssumeRoleしてKinesisにアクセスします。
ステップ1: AWS SDK for Rubyのインストール
まず、Railsアプリケーションで
AWS SDKを使用するために、
AWS SDK for Rubyをインストールします。
gem install aws-sdk-sts aws-sdk-kinesis
または、Gemfileに以下を追加し、bundle installを実行します。
gem 'aws-sdk-sts'
gem 'aws-sdk-kinesis'ステップ2: AssumeRoleの実装
Railsアプリケーション内で、
アカウントBのロールをAssumeRoleし、
Kinesisにアクセスするための一時的な認証情報を取得します。
require 'aws-sdk-sts'
require 'aws-sdk-kinesis'
class KinesisClient
def initialize
sts_client = Aws::STS::Client.new
assumed_role = sts_client.assume_role({
role_arn: 'arn:aws:iam::<アカウントBのID>:role/<RoleName>',
role_session_name: 'KinesisAccessSession'
})
credentials = assumed_role.credentials
@kinesis_client = Aws::Kinesis::Client.new(
access_key_id: credentials.access_key_id,
secret_access_key: credentials.secret_access_key,
session_token: credentials.session_token
)
end
def put_record(data)
@kinesis_client.put_record({
stream_name: '<KinesisStreamName>',
data: data,
partition_key: 'partition_key'
})
end
endAssumeRole
ここで、アカウントBのロールを引き受け、
Kinesisにアクセスするための一時的な認証情報を取得しています。put_record
一時的な認証情報を使って、
Kinesisにデータを書き込む処理を行います。
ステップ3: データを書き込む
取得した認証情報を使って、
RailsアプリケーションからKinesisにデータを書き込みます。
client = KinesisClient.new
client.put_record('Sample data')
これで、AWSアカウントAから
アカウントBのKinesisストリームに
データを書き込むことができるようになります。
ベストプラクティスと注意点
セキュリティ管理の徹底
クロスアカウントアクセスでは、
権限管理が非常に重要です。
IAMロールの信頼関係やポリシーは、
最小限の権限(最小特権の原則)で設定することが推奨されます。
セッションの管理
AssumeRoleによって取得した認証情報は、
一時的なものであり、デフォルトで1時間しか有効ではありません。
長時間のプロセスの場合は、
セッションの有効期限が切れる前に
新しい認証情報を取得する必要があります。
監査とロギング
CloudTrailを利用して、
どのアカウントがどのリソースにアクセスしたのかを監視し、
異常な動作がないかを確認するのも良い習慣です。
まとめ
AWSアカウントAのRailsアプリケーションから、
AWSアカウントBのKinesisに
データを書き込むための手順について解説しました。
AssumeRoleを使って、
セキュリティを確保しながら
別のアカウントのリソースにアクセスできるようになるため、
クロスアカウントアクセスのベストプラクティスに
従って安全に運用することができます。






