PR

【AWS】Lambdaで別アカウントのDynamoDBにクロスアカウントアクセスする方法を紹介!

記事内に広告が含まれています。
SNSフォローボタン
z_a_k_iをフォローする

この記事では、Lambdaで別アカウントのDynamoDBテーブルにアクセスする方法を紹介します。

こんな悩みをお持ちの方にオススメ!
  • Lambdaで別アカウントのDynamoDBにアクセスすることってできるの?
  • 別アカウントへのアクセスって一般的によくやることなの?
  • やったことがないので、設定手順を具体的に知りたい。

昨今のシステム開発では、AWSのLambdaなどのサーバーレスサービスを利用した開発が主流となってきています。

サーバーレスサービスを利用するとすばやく開発することができますが、AWSサービスの内容を知らないとどんなことができるかわかりません

アカウントの設計や別アカウントのリソースへのアクセスも、サーバーレスの特徴の一つです。

この記事では、別アカウントのDynamoDBテーブルへのアクセスする方法を題材に、クロスアカウントアクセスについて紹介します

「クロスアカウント」と似た言葉で「クロスリージョン」という言葉もあります。

この記事では、「クロスアカウント」と「クロスリージョン」の違いについてあわせて説明します。

はじめに

クロスアカウントアクセスとは

AWSでは「アカウント」という単位で契約を行います。

クロスアカウントアクセス」とは、アカウントを跨いで別のアカウントのリソースにアクセスすることです。

AWSで開発する現場では、セキュリティを考慮し、通常複数のアカウントを利用します。

例:アカウントの分け方

以下例の場合、Lambdaから別アカウントのDynamoDBテーブルにアクセスしたり、他システムと連携する際に別アカウントへのリソースへのアクセスが必要となります。

例1:リソースの種別ごとにアカウントを分ける

アカウントA:Lambdaなどのプログラムを管理するアカウント
アカウントB:DynamoDBやS3などのデータを管理するアカウント

例2:システムごとにアカウントを分け、ユーザ情報を共有する

アカウントA:AシステムのLambda、DynamoDBを管理するアカウント
アカウントB:BシステムでLambda、DynamoDBを管理するアカウント
アカウントC:Aシステム、Bシステムのログインユーザー情報を管理するアカウント

アカウントとユーザーの違い

アカウントとユーザーはAWSでは以下のように定義されています。混同しないようご注意を。

  • 「アカウント」=契約単位。
  • 「ユーザー」=アカウント内のログインユーザ。

クロスリージョンアクセスとは

「クロスリージョンアクセス」とは、実行リソースとは別のリージョンのリソースにアクセスすることです。

例:各国のデータ分析システム

東京リージョンのLambdaで各リージョンのデータを集めて分析結果を作成するプログラム。

別リージョンのデータを集める必要がある。

  • 東京リージョンのDynamoDB
    東京リージョンで構築された日本ユーザー向けのデータ
  • 北米リージョンのDynamoDB
    北米リージョンで構築された北米ユーザー向けのデータ
そもそも「リージョン」って?

AWSは全世界に配置された物理的なサーバーを利用してクラウド環境を提供しています。

この物理的なサーバーがどこの地域に配置しているかを表すのが「リージョン」です。

利用する場所から近いリージョンを選ぶことでネットワーク負荷が低くなり、高パフォーマンスが発揮されます。

例:東京の人が多く利用するシステムの場合

⭕️:東京リージョンで構築

❌:南米リージョンで構築

日本では、東日本に配置された「東京リージョン」、「西日本」に配置された「大阪リージョン」のふたつがあります。

クロスアカウントアクセスを実現するためのステップ

では、クロスアカウントアクセスを実現するための設定をしていきます。

アカウントの定義

説明をわかりやすくするために、ここでは以下のアカウントを定義します。

本検証で使うアカウント定義
  • アカウントA(DynamoDBにアクセスする側:Lambdaを作成するアカウント)
  • アカウントB(Lambdaにアクセスされる側:DynamoDBのテーブルを作成するアカウント)

各アカウントのリソースにはセキュリティ上、他のアカウントからアクセスできないように閉じられています。

クロスアカウントアクセスの設定

クロスアカウントアクセスを実現するには、限られたアカウントにアクセスを許可するための「信頼関係」の設定が必要です。

「信頼関係」とは特定のアカウントに特定の操作を許可する設定の総称です。

今回は、アカウントBに「アカウントAからの”DynamoDBを読み取る操作”を許可する」という信頼関係を設定していきます。

この信頼関係はIAMでロールを作成することになります。

信頼関係構築のステップ
  • Step1
    アカウントBに信頼関係用のロールを作成
  • Step2
    「Step1」で作成したロールに、アカウントAがAssumeRoleできるポリシーを設定
    AssumeRoleってなに?

    ロールを他のアカウントに一時的に貸し出せるようにすること

  • Step3
    アカウントAに「Step2」で作成したポリシーを設定したロールを作成

    AssumeRoleできるため、アカウントAからアカウントBのロールが使えます。

  • Step4
    アカウントAのLambda(アカウントBのDynamoDBテーブルにアクセスするLambda)に「Step3」のロールを設定。

順番に各ステップの設定内容を紹介します。

[Step1] :アカウントBに信頼関係のロールを作成

アカウントAがアカウントBのDynamDBのテーブルにアクセスを許可する信頼関係(ロール)を作成します。

アカウントBでAWS Consoleにログインし、IAMのサービスに移動します。移動後、「ロールを作成」ボタンからロールを作成していきます。

アカウントBに信頼関係のロールを作成

次へボタンをクリックし、「DynamoDB」を検索。Readアクセスにチェックし、次へボタンクリック。

アカウントBに信頼関係のロールにDynamoDBのポリシーを設定

ロール名をわかりやすい名称「DynamoDBReadAccess-For-AccuntA」を設定し、ロールを作成する

アカウントBに信頼関係のロール名の設定

[Step2]:「Step1」で作成したロールに、アカウントAがAssumeRoleできるポリシーを設定

アカウントAに上で作成したアカウントBのロールを利用するポリシーを作成していきます。

あらかじめ、アカウントBで上で作成したロールのARNをコピーしておきます。

アカウントAにログインし、AWS ConsoleでIAMのサービスに移動します。

「ポリシーの作成」ボタンをクリックし、ポリシーを作成していきます。JSONでの編集モードにして以下を設定していきます。塗りつぶされている箇所はアカウントBのアカウントIDです。

各環境に応じて変更してください。

アカウントAにAssumeRoleするポリシーを作成

上で設定するポリシー

{
    "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」としています。

アカウントAに作成したロールに名前を設定

ポリシーの作成ボタンをクリックし、ポリシーを作成します。

[Step3] :アカウントAに「Step2」で作成したポリシーを設定したロールを作成

次はアカウントAにアカウントBのDynamoDBを読み取ることができるロールを作成していきます。

通常のLambdaを実行する権限に追加して、上で作成したポリシーをロールに設定してきます。
アカウントAのIAMサービスからロールを作成していきます。

エンティティタイプを「AWS サービス」にし、ユースケースに「Lambda」を選択し次へボタンをクリック。

アカウントAに作成するロールの設定

上で作成したポリシー「DynamoDBReadAccess-For-AccuntB」を選択し次へボタンをクリック。

アカウントAに作成する、ロールに設定するポリシーの設定

ロール名に検証用のロールという意味で「Verificataion-AccountB-DynamoDB-Role」を設定し、ロールを作成します。

アカウントAに作成する、ロールに設定するポリシーの名前

[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などのサーバーレスを活用した開発は、設定方法を知ってしまえば開発の生産性が爆上がりします。

本記事が皆様の参考となりましたら幸いです。

参考書籍

コメント