ある AWS アカウント (アカウント A) で DynamoDB アクセラレーター (DAX) クラスターが実行されていて、別の AWS アカウント (アカウント B) の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスから DAX クラスターにアクセスできる必要があるとします。このチュートリアルでは、アカウント B の IAM ロールを持つ EC2 インスタンスをアカウント B で起動することでこれを実現します。次に、EC2 インスタンスの一時的なセキュリティ認証情報を使用して、アカウント A から IAM ロールを引き受けます。最後に、IAM ロールを引き受けることで得られた一時的なセキュリティ認証情報を使用し、アカウント A の DAX クラスターに対して Amazon VPC ピアリング接続を介してアプリケーション呼び出しを行います。これらのタスクを実行するには、両方の AWS アカウントで管理アクセスが必要です。
重要
DAX クラスターに、別のアカウントから DynamoDB テーブルにアクセスさせることはできません。
IAM のセットアップ
-
次のコンテンツを含む
AssumeDaxRoleTrust.json
という名前のテキストファイルを作成します。これにより、Amazon EC2 がお客様に代わって作業できるようになります。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
アカウント B で、インスタンスの起動時に Amazon EC2 が使用できるロールを作成します。
aws iam create-role \ --role-name AssumeDaxRole \ --assume-role-policy-document file://AssumeDaxRoleTrust.json
-
次のコンテンツを含む
AssumeDaxRolePolicy.json
という名前のテキストファイルを作成します。これにより、アカウント B の EC2 インスタンスで実行されているコードが、アカウント A の IAM ロールを引き受けることができるようになります。accountA
は、アカウント A の実際の ID に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::
accountA
:role/DaxCrossAccountRole" } ] } -
作成したロールにそのポリシーを追加します。
aws iam put-role-policy \ --role-name AssumeDaxRole \ --policy-name AssumeDaxRolePolicy \ --policy-document file://AssumeDaxRolePolicy.json
-
インスタンスプロファイルを作成して、インスタンスがロールを使用できるようにします。
aws iam create-instance-profile \ --instance-profile-name AssumeDaxInstanceProfile
-
ロールをインスタンスプロファイルに関連付けます。
aws iam add-role-to-instance-profile \ --instance-profile-name AssumeDaxInstanceProfile \ --role-name AssumeDaxRole
-
次の内容を含む
DaxCrossAccountRoleTrust.json
という名前のテキストファイルを作成します。これにより、アカウント B がアカウント A ロールを引き受けることができるようになります。accountB
は、アカウント B の実際の ID に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
accountB
:role/AssumeDaxRole" }, "Action": "sts:AssumeRole" } ] } -
アカウント A で、アカウント B が引き受けることができるロールを作成します。
aws iam create-role \ --role-name DaxCrossAccountRole \ --assume-role-policy-document file://DaxCrossAccountRoleTrust.json
-
DAX クラスターへのアクセスを許可する
DaxCrossAccountPolicy.json
という名前のテキストファイルを作成します。dax-cluster-arn
は、DAX クラスターの正しい Amazon リソースネーム (ARN) に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:ConditionCheckItem" ], "Resource": "
dax-cluster-arn
" } ] } -
アカウント A で、ロールにポリシーを追加します。
aws iam put-role-policy \ --role-name DaxCrossAccountRole \ --policy-name DaxCrossAccountPolicy \ --policy-document file://DaxCrossAccountPolicy.json
VPC をセットアップする
-
アカウント A の DAX クラスターのサブネットグループを見つけます。
cluster-name
は、アカウント B がアクセスする必要のある DAX クラスターの名前に置き換えます。aws dax describe-clusters \ --cluster-name
cluster-name
--query 'Clusters[0].SubnetGroup' -
その
subnet-group
を使用して、クラスターの VPC を見つけます。aws dax describe-subnet-groups \ --subnet-group-name
subnet-group
\ --query 'SubnetGroups[0].VpcId' -
その
vpc-id
を使用して、VPC の CIDR を見つけます。aws ec2 describe-vpcs \ --vpc
vpc-id
\ --query 'Vpcs[0].CidrBlock' -
アカウント B から、前のステップで見つかったものとは異なる重複しない CIDR を使用して VPC を作成します。次に、少なくとも 1 つのサブネットを作成します。AWS Management Console の VPC 作成ウィザードまたは AWS CLI のいずれかを使用できます。
-
アカウント B から、「VPC ピアリング接続の作成と使用」の説明に従って、アカウント A VPC へのピアリング接続をリクエストします。アカウント A から接続を受け入れます。
-
アカウント B から、新しい VPC のルーティングテーブルを見つけます。
vpc-id
は、アカウント B で作成した VPC の ID に置き換えます。aws ec2 describe-route-tables \ --filters 'Name=vpc-id,Values=
vpc-id
' \ --query 'RouteTables[0].RouteTableId' -
アカウント A の CIDR 宛てのトラフィックを VPC ピアリング接続に送信するルートを追加します。必ず、各
ユーザー入力プレースホルダ
は、アカウントの正しい値に置き換えます。aws ec2 create-route \ --route-table-id
accountB-route-table-id
\ --destination-cidraccountA-vpc-cidr
\ --vpc-peering-connection-idpeering-connection-id
-
アカウント A から、以前に見つけた
vpc-id
を使用して DAX クラスターのルートテーブルを見つけます。aws ec2 describe-route-tables \ --filters 'Name=vpc-id, Values=
accountA-vpc-id
' \ --query 'RouteTables[0].RouteTableId' -
アカウント A から、アカウント B の CIDR 宛てのトラフィックを VPC ピアリング接続に送信するルートを追加します。各
ユーザー入力プレースホルダ
は、アカウントの正しい値に置き換えます。aws ec2 create-route \ --route-table-id
accountA-route-table-id
\ --destination-cidraccountB-vpc-cidr
\ --vpc-peering-connection-idpeering-connection-id
-
アカウント B から、前のステップで作成した VPC で EC2 インスタンスを起動します。それに
AssumeDaxInstanceProfile
を指定します。AWS Management Console または AWS CLI いずれかの Launch Wizard を使用できます。インスタンスのセキュリティグループをメモしておきます。 -
アカウント A から、DAX クラスターが使用するセキュリティグループを見つけます。
cluster-name
を DAX クラスターの名前に置き換えることを記憶します。aws dax describe-clusters \ --cluster-name
cluster-name
\ --query 'Clusters[0].SecurityGroups[0].SecurityGroupIdentifier' -
アカウント B で作成した EC2 インスタンスのセキュリティグループからのインバウンドトラフィックを許可するように、DAX クラスターのセキュリティグループを更新します。
ユーザー入力プレースホルダー
は、アカウントの正しい値に置き換えることを記憶します。aws ec2 authorize-security-group-ingress \ --group-id
accountA-security-group-id
\ --protocol tcp \ --port 8111 \ --source-groupaccountB-security-group-id
\ --group-owneraccountB-id
この時点で、アカウント B の EC2 インスタンスのアプリケーションは、インスタンスプロファイルを使用して arn:aws:iam::
ロールを引き受け、DAX クラスターを使用できます。accountA-id
:role/DaxCrossAccountRole
クロスアカウントアクセスを許可するように DAX クライアントを変更します
注記
AWS Security Token Service (AWS STS) 認証情報は一時的な認証情報です。自動的に更新を処理するクライアントもあれば、認証情報を更新するための追加のロジックを必要とするクライアントもあります。該当するマニュアルの指示に従うことをお勧めします。
このセクションでは、既存の DAX クライアントコードを変更して、クロスアカウント DAX アクセスを許可する方法について説明します。DAX クライアントコードがまだない場合は、「Java および DAX」チュートリアルで実際のコード例を見つけることができます。
-
次のインポートを追加します。
import com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider; import com.amazonaws.services.securitytoken.AWSSecurityTokenService; import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder;
-
AWS STS から認証情報プロバイダを取得し、DAX クライアントオブジェクトを作成します。必ず、各
ユーザー入力プレースホルダ
は、アカウントの正しい値に置き換えます。AWSSecurityTokenService awsSecurityTokenService = AWSSecurityTokenServiceClientBuilder .standard() .withRegion(
region
) .build(); STSAssumeRoleSessionCredentialsProvider credentials = new STSAssumeRoleSessionCredentialsProvider.Builder("arn:aws:iam::accountA
:role/RoleName
", "TryDax") .withStsClient(awsSecurityTokenService) .build(); DynamoDB client = AmazonDaxClientBuilder.standard() .withRegion(region
) .withEndpointConfiguration(dax_endpoint
) .withCredentials(credentials) .build();