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
end
AssumeRole
ここで、アカウント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
を使って、
セキュリティを確保しながら
別のアカウントのリソースにアクセスできるようになるため、
クロスアカウントアクセスのベストプラクティスに
従って安全に運用することができます。