TOP>コラム一覧>Athenaでのクロスアカウント接続 SageMakerの閉域化と監視及び接続のセキュア化(前編)

Athenaでのクロスアカウント接続
SageMakerの閉域化と監視及び接続のセキュア化
(前編)

1. 概要

AWSアカウント間でデータをやり取りする場合に、大規模環境であればAWS Organizationsの利用が効率的ですが、AWS Organizationsを使わない中規模以下の案件では、簡易的かつできるだけセキュアにクロスアカウント接続を設計する方法が求められます。また、マネージドサービスであるAmazon SageMakerはインターネットからアクセスして利用しますが、VPC内で閉じてセキュアにしたいという要件もあります。
今回は、SageMakerの閉域化、及び、Amazon Athena、 Amazon SageMaker、 Amazon S3をクロスアカウント接続する方法をご紹介します。

2. 初期構成

まず、アカウントXに初期構成を行います。VPC、サブネット、NATゲートウェイ、インターネットゲートウェイ、ルートテーブルを作成します。

VPC

CIDR: 10.10.16.0/20

サブネット

サブネット ネットワーク 用途
パブリックサブネット 10.10.17.0/24 NATゲートウェイ
プライベートサブネット1 10.10.24.0/24 SageMaker
プライベートサブネット2 10.10.25.0/24 WorkSpaces
プライベートサブネット3 10.10.26.0/24 WorkSpaces

ルートテーブル(パブリックサブネット)

送信先 ターゲット
10.10.16.0/20 local
0.0.0.0/0 インターネットゲートウェイ

ルートテーブル(プライベートサブネット1,2,3)

送信先 ターゲット
10.10.16.0/20 local
0.0.0.0/0 NATゲートウェイ

これで初期構成の構築が完了しました。

3. SageMakerの閉域化

SageMaker Studioの ノートブックにインターネットアクセスを提供しないようにするには、「VPC onlyネットワークアクセス」を指定してインターネットアクセスを無効にします。これにより、次の条件を満たさない限り、Studio ノートブックを実行できなくなります。

  • VPC に SageMaker API とランタイムへのインターフェイスエンドポイントがある
  • インターネットにアクセスできる NAT ゲートウェイがある
  • セキュリティグループでアウトバウンド接続が許可されている

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/studio-notebooks-and-internet-access.html

4. Athena

Athenaの設計を検討します。Athenaは以下のようにSageMakerからデータ取得を行うことができるようにします。

  1. ① S3配置先をデータソースとしてGlueに登録。
  2. ② SageMaker内から、データソースを指定してクエリを実行
  3. ③ ①のAWS Glueのカタログ情報が参照され、Athenaへ接続
  4. ④ Athenaのメタ情報から③に対応するS3バケット内のデータに対してクエリを実施。
  5. ⑤ ②の結果が、S3バケットからSageMakerに返却される

5. クロスアカウント接続

クロスアカウント接続として、別アカウントYに存在するS3バケットに対してクロスアカウント接続させたい場合、以下のような経路でデータ取得ができるようにします。

  • アカウントY(S3)←アカウントX(Athena)
  • アカウントY(S3)←アカウントX(Athena)←アカウントX(SageMaker)
  • アカウントY(S3)←アカウントX(SageMaker)

例えば、アカウントXのAthena(IAMユーザでログインして操作)、及び、SageMaker(ロールで操作)からアカウントYのS3バケット(s3bucker2222)へ読み取り専用でアクセスさせたい場合には、以下のように構成します。

  1. ① アカウントX側で、アカウントYのS3バケットに対して読み取りアクセスのみが可能なポリシーを作成
  2. ② ①をIAMユーザ、及び、ロールにアタッチ
  3. ③ ②のユーザ及びロールの受け入れて許可し、その権限は読み取りアクセスのみとするPrincipal-policyを作成
  4. ④ ③をアカウントYのS3バケットにアタッチ
  5. ⑤ AthenaやSageMakerからクロスアカウント接続を実施

6. 追加構成の構築(その1)

2.初期構成に、3.SageMaker、4.Athena、5.クロスアカウント接続を構築していきます。

① SageMaker

SageMaker Studio Domainのネットワーク設定

SageMaker Studio DomainをVPCのみモードに設定し、プライベートサブネット1内に設置します。

ネットワークモード VPC サブネット セキュリティーグループ
仮想プライベートクラウド (VPC) のみ 2.初期構成で作成したVPC プライベートサブネット1 デフォルトセキュリティーグループ
(インバウンド/アウトバウンドともにすべて許可)

SageMaker Studioユーザの実行ロール

また、SageMaker Studio notebookを実行ユーザのロールを以下のように設定します。権限の強いポリシーを割り当てておりますが、必要に応じて、変更を行ってください。

ポリシー名 内容
AmazonAthenaFullAccess Athenaに関するフルアクセス
AmazonSageMakerFullAccess SageMakerに関するフルアクセス
AWSGlueConsoleFullAccess コンソール経由でのGlueに関するフルアクセス
AWSGlueServiceRole Glueサービスに関するフルアクセス

以下を参考にして、SageMaker Studioのnotebookを起動してください。

Amazon SageMakerについて調べてみた|伊藤忠テクノソリューションズ

動作確認として、以下のようにパッケージ更新を実行することができれば、プライベートサブネットに配置したSageMakerからインターネット経由で通信ができていることが分かります。

import sys
!{sys.executable} -m pip install awswrangler    

② S3、Athena、VPCエンドポイント

S3にサンプルデータを配置します。次に、Athenaにそのデータをロケーションとしたデータベースとテーブルを設定し、VPCエンドポイントを設定します。

S3バケットにおけるオブジェクト配置

テスト的に以下のようにオブジェクトを配置します

バケット名 S3 URI オブジェクト名
s3bucket-xxxx s3://s3bucket-xxxx /01_test/parquet/2025/02 20250201.parquet
s3bucket-xxxx s3://s3bucket-xxxx /01_test/parquet/2025/02 20250202.parquet
s3bucket-xxxx s3://s3bucket-xxxx /01_test/parquet/2025/03 20250301.parquet

Athenaデータベースとテーブルの設定

上記のS3データをAthenaから読み込めるように、データベース名、テーブル名、Locaitonを設定します。

データベース名 テーブル名 Location
db-xxxx table2025 s3://s3bucket-xxxx /01_test/parquet/2025/

VPCエンドポイントの設定

SageMakerが閉域であるため、プライベートサブネットからAthenaとS3に対するVPCエンドポイントが必要となるため、その設定をします。

対象サブネット エンドポイント名 エンドポイントタイプ サービス名
プライベートサブネット1,2,3 xxxx-vpce-athena Interface com.amazonaws.ap-northeast-1.athena
プライベートサブネット1,2,3 xxxx-vpce-s3 Gateway com.amazonaws.ap-northeast-1.s3

ルートテーブルの追加(プライベートサブネット1,2,3)

なお、S3のVPCエンドポイントをGateway型とする場合、プライベートサブネットのルートテーブルにエントリが自動的に追加される。この設定により、プライベートサブネット内からS3へアクセスしたい場合には、NAT経由ではなくVPCエンドポイントを経由するようになる。

送信先 ターゲット
10.10.16.0/20 local
0.0.0.0/0 NATゲートウェイ
pl-xxxxxxx
(自動設定されたS3のプレフィックスリスト)
S3のVPCエンドポイント

7. 追加構成の構築(その2)

さらに、5.クロスアカウント接続を構築していきます。

アカウントY側のS3バケットにおけるオブジェクト配置

テスト的に以下のようにオブジェクトを配置します。

バケット名 S3 URI オブジェクト名
s3bucket-yyyy s3://s3bucket-yyyy /01_test/parquet/2025/02 20250201.parquet
s3bucket-yyyy s3://s3bucket-yyyy /01_test/parquet/2025/02 20250202.parquet
s3bucket-yyyy s3://s3bucket-yyyy /01_test/parquet/2025/03 20250301.parquet

Athenaデータベースとテーブルの設定

上記のS3データをAthenaから読み込めるように、データベース名、テーブル名、Locaitonを設定します。

データベース名 テーブル名 Location
db-xxxx cross_table2025 s3://s3bucket-yyyy /01_test/parquet/2025/

ポリシー、ロール

アカウントX側に以下のポリシー(access-policy)を作成します(バケット名は仮名で設定しています)。このポリシーをアカウントYにアクセスしたいユーザ、やロールにアタッチします。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [               
                "s3:GetObject", 
                "s3:ListBucket" 
            ],        
            "Resource": [                
                "arn:aws:s3:::s3bucket2222", 
                "arn:aws:s3:::s3bucket2222/*" 
            ]   
        }
    ]
}    

続いて、アカウントY側のS3バケットにバケットポリシーを作成します。(アカウントXのアカウントID、受け入れ許可するユーザ名/ロール名は仮名で設定しています)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal":{
            "AWS":[
                "arn:aws:iam::111111111111:user/usr111",
                "arn:aws:iam::111111111111:role/access-role"
                ]
            },
            "Action": [               
                "s3:GetObject", 
                "s3:ListBucket" 
            ],        
            "Resource": [                
                "arn:aws:s3:::s3bucket2222",                       
                "arn:aws:s3:::s3bucket2222/*" 
            ]   
        }
   ]
}

ここまでの構成をまとめると以下のようになります。

8. 動作確認

① Athena→S3

SELECT * FROM " db-xxxx"." table2025" limit 10;

※実行例です。正常に出力結果が返ってくることを示すために、表記したデータベース名、テーブル名は異なっています。(以下同じ)

② クロスアカウント接続(Athena→S3)

SELECT * FROM " db-xxxx"." cross_table2025" limit 10;

③ SageMaker→S3

import pandas as pd
df=pd.read_parquet("s3://s3bucket-xxxx/01_test/parquet/2025/02/20250201.parquet ")
df    

④ SageMaker→Athena→S3

import awswrangler as wr
database   = 'db-xxxx'
query = '''
    select * from table2025
'''
athena_df = wr.athena.read_sql_query(
    sql=query,
    database=database
)    

⑤ クロスアカウント接続(SageMaker→Athena→S3)

import awswrangler as wr
database   = 'db-xxxx'
query_cross = '''
  select * from cross_table2025
'''
athena_df_cross = wr.athena.read_sql_query(
    sql=query_cross,
    database=database
)

9. まとめ

このように、SageMakerの閉域化、及び、Amazon Athena、 Amazon SageMaker、 Amazon S3をクロスアカウント接続する方法をご紹介しました。後編では、この構成にログ確認とリモート接続制御の構成を追加していきます。

Athenaでのクロスアカウント接続 SageMakerの閉域化と監視及び接続のセキュア化(後編)

CTCは、AWSのビジネス利活用に向けて、お客様のステージに合わせた幅広い構築・運用支援サービスを提供しています。
経験豊富なエンジニアが、ワンストップかつ柔軟にご支援します。
ぜひ、お気軽にお問い合わせください。

お問い合わせ

【著者プロフィール】

山近 和樹(やまちか かずき)

伊藤忠テクノソリューションズ株式会社

AWS Certified Solutions Architect – Professional
AWS Certified DevOps Engineer – Professional
AWSを中心に機械学習における分析やAIシステム導入のプリセールス及び設計・導入を担当。
社内活動としてAWS AI/MLサービスの啓蒙活動に取り組んでいる。

山近 和樹(やまちか かずき)

TOP>コラム一覧>Athenaでのクロスアカウント接続 SageMakerの閉域化と監視及び接続のセキュア化(前編)

pagetop