この記事では、Lambdaで別アカウントのDynamoDBテーブルにアクセスする方法を紹介します。
昨今のシステム開発では、AWSのLambdaなどのサーバーレスサービスを利用した開発が主流となってきています。
サーバーレスサービスを利用するとすばやく開発することができますが、AWSサービスの内容を知らないとどんなことができるかわかりません。
アカウントの設計や別アカウントのリソースへのアクセスも、サーバーレスの特徴の一つです。
この記事では、別アカウントのDynamoDBテーブルへのアクセスする方法を題材に、クロスアカウントアクセスについて紹介します。
はじめに
クロスアカウントアクセスとは
AWSでは「アカウント」という単位で契約を行います。
「クロスアカウントアクセス」とは、アカウントを跨いで別のアカウントのリソースにアクセスすることです。
AWSで開発する現場では、セキュリティを考慮し、通常複数のアカウントを利用します。
クロスリージョンアクセスとは
「クロスリージョンアクセス」とは、実行リソースとは別のリージョンのリソースにアクセスすることです。
クロスアカウントアクセスを実現するためのステップ
では、クロスアカウントアクセスを実現するための設定をしていきます。
アカウントの定義
説明をわかりやすくするために、ここでは以下のアカウントを定義します。
各アカウントのリソースにはセキュリティ上、他のアカウントからアクセスできないように閉じられています。
クロスアカウントアクセスの設定
クロスアカウントアクセスを実現するには、限られたアカウントにアクセスを許可するための「信頼関係」の設定が必要です。
「信頼関係」とは特定のアカウントに特定の操作を許可する設定の総称です。
- Step1アカウントBに信頼関係用のロールを作成
- Step2「Step1」で作成したロールに、アカウントAがAssumeRoleできるポリシーを設定
- Step3アカウントAに「Step2」で作成したポリシーを設定したロールを作成
AssumeRoleできるため、アカウントAからアカウントBのロールが使えます。
- Step4アカウントAのLambda(アカウントBのDynamoDBテーブルにアクセスするLambda)に「Step3」のロールを設定。
順番に各ステップの設定内容を紹介します。
[Step1] :アカウントBに信頼関係のロールを作成
アカウントAがアカウントBのDynamDBのテーブルにアクセスを許可する信頼関係(ロール)を作成します。
アカウントBでAWS Consoleにログインし、IAMのサービスに移動します。移動後、「ロールを作成」ボタンからロールを作成していきます。
次へボタンをクリックし、「DynamoDB」を検索。Readアクセスにチェックし、次へボタンクリック。
ロール名をわかりやすい名称「DynamoDBReadAccess-For-AccuntA」を設定し、ロールを作成する
[Step2]:「Step1」で作成したロールに、アカウントAがAssumeRoleできるポリシーを設定
アカウントAに上で作成したアカウントBのロールを利用するポリシーを作成していきます。
あらかじめ、アカウントBで上で作成したロールのARNをコピーしておきます。
アカウントAにログインし、AWS ConsoleでIAMのサービスに移動します。
「ポリシーの作成」ボタンをクリックし、ポリシーを作成していきます。JSONでの編集モードにして以下を設定していきます。塗りつぶされている箇所はアカウントBのアカウントIDです。
各環境に応じて変更してください。
上で設定するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::アカウントBのARN:role/DynamoDBReadAccess-For-AccuntA"
}
]
}
「次へ」ボタンを押下し以下の画面でポリシー名をわかりやすい名称にし、ポリシーを作成します。
今回は、アカウントBのDynamoDBにアクセスするポリシーということで「DynamoDBReadAccess-For-AccuntB」としています。
ポリシーの作成ボタンをクリックし、ポリシーを作成します。
[Step3] :アカウントAに「Step2」で作成したポリシーを設定したロールを作成
次はアカウントAにアカウントBのDynamoDBを読み取ることができるロールを作成していきます。
通常のLambdaを実行する権限に追加して、上で作成したポリシーをロールに設定してきます。
アカウントAのIAMサービスからロールを作成していきます。
エンティティタイプを「AWS サービス」にし、ユースケースに「Lambda」を選択し次へボタンをクリック。
上で作成したポリシー「DynamoDBReadAccess-For-AccuntB」を選択し次へボタンをクリック。
ロール名に検証用のロールという意味で「Verificataion-AccountB-DynamoDB-Role」を設定し、ロールを作成します。
[Step4] :アカウントAのLambda(アカウントBのDynamoDBテーブルにアクセスするLambda)に「Step3」のロールを設定。
アカウントAのLambdaプログラムを作成し、Lambdaに設定するロールにStep3で作成した「Verificataion-AccountB-DynamoDB-Role」を設定します。
以下のコードを記載することでアカウントBのDynamoDBのテーブルからデータを取得することが可能です。
AmazonDynamoDBオブジェクトを作成する時に、アカウントBにAssumeRoleした認証情報を設定することで、アカウントBのDynamoDBテーブルにアクセスすることが可能です。
AmazonDynamoDB amazonDYnamoDBClient;
String roleArn = "arn:aws:iam::アカウントBのARN:role/DynamoDBReadAccess-For-AccuntA"";
String roleSessionName = "mySession";
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClient.builder().withRegion("us-east-1").build();
AssumeRoleRequest roleRequest = new AssumeRequest().withRoleArn(roleArn).withRoleSessionName(roleSessionName);
AssumeRoleResult roleResponse = stsClient.assueRole(roleRequest);
// 認証情報作成
Credentials myCreds = roleResponse.getCredentials();
String key = myCreds.getAccessKeyId();
String secKey = myCreds.getSecretAccessKey();
String secToken = myCreds.getSessionToken();
BasicSessionCredentials awsCreds = new BasicSessionCredentials(key,secKey,secToken):
// 認証情報を使ってDBクライアントを作成
amazonDynamoDBClient = AmazonDynamoDBClient.builder().withRegion("us-east-1").withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
// テーブルへのMapperを作成
DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDBClient);
DynamoDBScanExpression queryExpression = new DynamoDBScanExpression():
// データの取得
try{
var responseList = mapper.scan(TestTableData.class, queryExpression):
}catch(Exception e){
System.out.println("エラーが発生しました"):
}
TestTableDataクラス
@NoArgsConstructor
@Getter
@Setter
@ToString
@DynamoDBTable(tableName="test-table")
public class TestTableData{
@DynamoDBHashKey(attributeName="pk1")
private String pk1;
@DynamoDBAttribute(attributeName="name")
private String name;
}
利用するAWSのSDKは「com.amazonaws」を利用しています。
pom.xmlに設定して、mavenコマンドでSDKをインストールしてください。
クロスリージョンを実現するためのステップ
同一アカウントの場合は、なにもせずにクロスリージョンアクセスが可能です。
別アカウントの場合でも、クロスアカウントアクセスの設定をすることで別アカウントのクロスリージョンアクセスも可能となります。
まとめ
本記事では、別アカウントのDynamoDBテーブルへのアクセスする方法を題材に、クロスアカウントアクセスについて紹介しました。
AWSなどのサーバーレスを活用した開発は、設定方法を知ってしまえば開発の生産性が爆上がりします。
本記事が皆様の参考となりましたら幸いです。
コメント