翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon DynamoDB へのクロスアカウントアクセスを設定する
作成者: Shashi Dalmia (AWS) and Jay Enjamoori (AWS)
環境:本稼働 | テクノロジー: DevOps、データベース、セキュリティ、アイデンティティ、コンプライアンス | AWS サービス:Amazon DynamoDB、AWS Identity and Access Management、AWS Lambda |
[概要]
このパターンは、Amazon DynamoDB へのクロスアカウントアクセスを設定手順を説明しています。Amazon Web Services (AWS) サービスは、データベースで適切な AWS Identity and Access Management (IAM) アクセス許可が設定されていれば、同じ AWS アカウントにある DynamoDB テーブルにアクセスできます。ただし、別の AWS アカウントからアクセスするには、IAM アクセス許可を設定し、2 つのアカウント間の信頼関係を確立する必要があります。
このパターンでは、あるアカウントで AWS Lambda 関数を設定して、別のアカウントの DynamoDB テーブルに対して読み取りと書き込みを行う方法を示す手順とサンプルコードを示します。
前提条件と制限
アーキテクチャ
以下の図では、AWS Lambda、Amazon EC2、DynamoDB、DynamoDB はすべて同じアカウントにあります。このシナリオでは、Lambda 関数と Amazon Elastic Compute Cloud (Amazon EC2) インスタンスが DynamoDB にアクセスできます。
![同じアカウントから DynamoDB にアクセスする](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/4cd75ed4-98d8-4398-abaf-20d982477ec4.png)
別の AWS アカウントのリソースが DynamoDB にアクセスしようとする場合、クロスアカウントアクセスと信頼関係を設定する必要があります。たとえば、次の図で、アカウント A の DynamoDB とアカウント B の Lambda 関数間のアクセスを有効にするには、「エピック」セクションで説明されているように、アカウント間に信頼関係を作成し、Lambda サービスとユーザーに適切なアクセス権を付与する必要があります。
![別のアカウントから DynamoDB にアクセスする](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/28331655-18a6-4da1-a5ad-9831e040b7f8.png)
ツール
AWS サービス
「Amazon DynamoDB」は、フルマネージド NoSQL データベースサービスであり、シームレスなスケーラビリティを備えた高速で予測可能なパフォーマンスを提供します。
「AWS Lambda」 – AWS Lambda はサーバーのプロビジョニングや管理を行わずにコードの実行を支援できるコンピューティングサービスです。Lambda は必要に応じてコードを実行し、1 日あたり数個のリクエストから 1 秒あたり数千のリクエストまで自動的にスケールします。課金は実際に消費したコンピューティング時間に対してのみ発生します。コードが実行されていない場合、料金は発生しません。
「AWS Identity and Access Management (IAM)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。
Code
このパターンには、アカウント B の Lambda 関数を設定してアカウント A の DynamoDB テーブルへの書き込みと読み取りを行う方法を示すサンプルコードが「追加情報」セクションに含まれています。このコードは説明とテストのみを目的としています。このパターンを本番環境に実装する場合は、コードをリファレンスとして使用し、自分の環境に合わせてカスタマイズしてください。
このパターンは、Lambda と DynamoDB によるクロスアカウントアクセスを示しています。他の AWS サービスでも同じ手順を使用できますが、両方のアカウントに適切な権限を付与し、設定していることを確認してください。たとえば、アカウント A の Amazon Relational Database Service (Amazon RDS) データベースへのアクセスを許可したい場合は、そのデータベースのロールを作成し、信頼関係にバインドします。アカウント B で、AWS Lambda の代わりに Amazon EC2 を使用する場合は、それぞれの IAM ポリシーとロールを作成し、それらを EC2 インスタンスにアタッチします。
エピック
タスク | 説明 | 必要なスキル |
---|---|---|
アカウント A でDynamoDB テーブルを作成します。 | アカウント A 用に AWS CLI を設定したら、次の AWS CLI コマンドを使用して DynamoDB テーブルを作成します。
テーブルの作成の詳細については、「DynamoDB のドキュメント」を参照してください。 | AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
アカウント A でロールを作成します。 | アカウント B がこのロールを使用してアカウント A にアクセスする許可を取得します。ロールを作成するには:
ロールの作成の詳細については、「IAM ドキュメント」を参照してください。 | AWS DevOps |
アカウント A のロールの ARN をメモしてください。 |
| AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
アカウント A にアクセスするポリシーを作成します。 |
ポリシーの作成の詳細については、「IAM のドキュメント」を参照してください。 | AWS DevOps |
ポリシーに基づいてロールを作成します。 | このロールは、アカウント B の Lambda 関数がアカウント A の DynamoDB テーブルへの読み取りと書き込みに使用されます。
これで、このロールを次のエピックの Lambda 関数にアタッチできます。 ロールの作成の詳細については、「IAM ドキュメント」を参照してください。 | AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
DynamoDB にデータを書き込むLambda 関数を作成します。 |
Lambda 関数の作成についての詳細は、「Lambda ドキュメント」を参照してください。 | AWS DevOps |
DynamoDB からデータを読み取る Lambda 関数を作成します。 |
Lambda 関数の作成についての詳細は、「Lambda ドキュメント」を参照してください。 | AWS DevOps |
タスク | 説明 | 必要なスキル |
---|---|---|
作成したリソースを削除します。 | このパターンをテスト環境または概念実証 (PoC) 環境で実行する場合は、コストが発生しないように作成したリソースを削除してください。
| AWS DevOps |
関連リソース
「AWS CLI の使用を開始する」(AWS CLI ドキュメント)
「AWS CLI の設定」(AWS CLI ドキュメント)
「DynamoDB の使用を開始する」(DynamoDB ドキュメント)
「Lambda の使用を開始する」(AWS Lambda ドキュメント)
「IAM ユーザーにアクセス許可を委任するロールの作成」(IAM ドキュメント)
「IAM ポリシーの作成」(IAM ドキュメント)
「クロスアカウントポリシーの評価ロジック」(IAM ドキュメント)
「IAM JSON ポリシー要素のリファレンス」(IAM ドキュメント)
追加情報
このセクションのコードは、説明とテストのみを目的としています。このパターンを本番環境に実装する場合は、コードをリファレンスとして使用し、自分の環境に合わせてカスタマイズしてください。
Lambda 書き込み関数
サンプルコード
import boto3 from datetime import datetime sts_client = boto3.client('sts') sts_session = sts_client.assume_role(RoleArn='arn:aws:iam::<Account-A ID>:role/DynamoDB-FullAccess-For-Account-B', RoleSessionName='test-dynamodb-session') KEY_ID = sts_session['Credentials']['AccessKeyId'] ACCESS_KEY = sts_session['Credentials']['SecretAccessKey'] TOKEN = sts_session['Credentials']['SessionToken'] dynamodb_client = boto3.client('dynamodb', region_name='<DynamoDB-table-region-in-account-A', aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, aws_session_token=TOKEN) def lambda_handler(event, context): now = datetime.now() date_time = now.strftime("%m/%d/%Y, %H:%M:%S") data = dynamodb_client.put_item(TableName='Table-Acccount-A', Item={"category": {"S": "Fruit"},"item": {"S": "Apple"},"time": {"S": date_time}}) return data
サンプル出力
![Lambda 書き込み関数からのサンプル出力](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/880a9f04-7e38-46dd-8ce3-91e562259420.png)
Lambda 読み取り関数
サンプルコード
import boto3 from datetime import datetime sts_client = boto3.client('sts') sts_session = sts_client.assume_role(RoleArn='arn:aws:iam::<Account-A ID>:role/DynamoDB-FullAccess-For-Account-B', RoleSessionName='test-dynamodb-session') KEY_ID = sts_session['Credentials']['AccessKeyId'] ACCESS_KEY = sts_session['Credentials']['SecretAccessKey'] TOKEN = sts_session['Credentials']['SessionToken'] dynamodb_client = boto3.client('dynamodb', region_name='<DynamoDB-table-region-in-account-A>', aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, aws_session_token=TOKEN) def lambda_handler(event, context): response = dynamodb_client.get_item(TableName='Table-Acccount-A', Key={'category':{'S':'Fruit'}, 'item':{'S':'Apple'}}) return response
サンプル出力
![Lambda 読み取り関数からのサンプル出力](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/38ff890e-1d4c-4b14-9aa2-a2da4304a73b.png)