[AWS](WA)バケットポリシーを使用した Lambda クロスアカウント

AWS

元ネタ

AWSのWell-Architected Frameworkを改めて整理。せっかくなんでハンズオン形式で学べるAWS Well-Architected Labsをやってみよう!ということで、備忘も兼ねて実践&記録をしてみました。

Workshop Studio
Discover and participate in AWS workshops and GameDays

前提条件

  • AWSのrootアカウントが2つあること
  • 一方のアカウントにS3バケットがあること

ハンズオン開始

0. 概要

このハンズオンでは、AWS アカウント 2 (宛先) の S3 バケット ポリシー (リソースベースのポリシーの一種) の設定を示します。これにより、AWS アカウント 1 (発信元) の Lambda 関数が Python boto を使用してバケット内のオブジェクトを一覧表示できるようになります。

1. S3バケット名確認 [アカウント2]

まずはアカウント2にあるS3バケットの名前を確認します。

バケット名確認手順

  1. アカウント2でS3コンソールを開き、対象となるバケットの名前をコピーしておく。

2. Lambda用のロール作成 [アカウント1]

Lambdaに使用するIAMロールを作成します。

ロール作成手順

  1. アカウント1でIAMコンソールのロールを開き、「ロールを作成」を選択する。
  1. 「信頼されたエンティティタイプ」は「AWSのサービス」を、「ユースケース」の「サービスまたはユースケース」で「Lambda」を選択した上で、「ユースケース」にLambdaを選択し、「次へ」を選択する。
  1. 「許可を追加」は何もせずに「次へ」を選択する。
  1. 「ロールの詳細」の「ロール名」に「Lambda-List-S3-Role」を入力する。
  1. 「ロールを作成」を選択する。
  1. 作成完了のメッセージを確認する。
  1. 作成したロールの詳細を確認し、「許可」タブの「許可を追加」より「インラインポリシーを作成」を選択する。
  1. 「アクセス許可を指定」より「JSON」を選択し、ポリシーエディタに以下を貼り付け、「次へ」を選択する。<account1>はアカウント1のAWSアカウント番号(ダッシュなし12桁)を、<bucketname>はS3バケット名に置き換える。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3ListBucket",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::<bucketname>"
        },
        {
            "Sid": "logsstreamevent",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:us-east-1:<account1>:log-group:/aws/lambda/Lambda-List-S3*/*"
        },
        {
            "Sid": "logsgroup",
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "*"
        }
    ]
}
  1. 「ポリシーの詳細」の「ポリシー名」に「Lambda-List-S3-Policy」を入力し、「ポリシーの作成」を選択する。
  1. ポリシー作成完了のメッセージを確認する。

3. S3バケットポリシーの更新 [アカウント2]

作成したロールでアクセスできるように対象となるS3バケットのバケットポリシーを更新します。

バケットポリシー更新手順

  1. アカウント2でログインし、S3コンソールより対象のS3バケットの詳細を開く。
  1. 「アクセス許可」タブを開く。
  2. 「バケットポリシー」の「編集」を選択する。
  1. 「バケットポリシー」の「ポリシー」に以下を貼り付ける。<account1>にはアカウント1のAWSアカウント番号(ダッシュなし12桁)を、<bucketname>にはS3バケット名に置き換える。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1565731301209",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::<bucketname>",
            "Principal": {
                "AWS":"arn:aws:iam::<account1>:role/Lambda-List-S3-Role"
            },
            "Condition": {
                "StringLike": {
                    "aws:UserAgent": "*AWS_Lambda_python*"
                }
            }
        }
    ]
}
  1. 「変更の保存」を選択する。
  1. 編集完了のメッセージを確認する。

4. Lambda関数の作成 [アカウント1]

アカウント1でS3バケット内を参照するLambda関数を作成し、テストします。

Lambda関数作成手順

  1. アカウント1でログインし、Lambdaコンソールの「関数」より、「関数の作成」を選択する。
  1. 「関数の作成」では「一から作成」を選択し、「関数名」に「Lambda-List-S3」を入力、「ランタイム」で「Python 3.12」を選択する。
  1. 「デフォルトの実行ロールの変更」を開き、「実行ロール」で「既存のロールを使用する」を選択した上で、「既存のロール」に作成した「Lambda-List-S3-Role」を選択する。「関数の作成」を選択する。
  1. 作成完了のメッセージを確認する。
  1. 対象のLambda関数の詳細から「コード」タブを開き、内容に以下を貼り付ける。<bucketname>はS3バケット名に置き換える。「Deploy」を選択する。
import json
import boto3
import os
import uuid

def lambda_handler(event, context):
    try:

        # Create an S3 client
        s3 = boto3.client('s3')

        # Call S3 to list current buckets
        objlist = s3.list_objects(
                        Bucket='<bucketname>',
                        MaxKeys = 10)

        print (objlist['Contents'])
        return str(objlist['Contents'])


    except Exception as e:
        print(e)
        raise e
  1. 更新完了のメッセージを確認する。
  1. 「テスト」タブを開き、「テスト」を選択する。
自分
自分

ここまでやりましたが、結果としてはテストが成功しませんでした。もう少し調べて間違いがあれば更新します。

Appendix. クリーンアップ手順

作成したリソースのクリーンアップ手順です。

Lambda削除手順

  1. アカウント1でログインし、Lambdaコンソールより関数を開き、作成したラムダ関数「Lambda-List-S3」をオンにした上で、「アクション」にある「削除」を選択する。
  1. 「1関数の削除」の最下部の入力ボックスに「削除」を入力し、「削除」を選択する。
  1. 「1関数の削除」にて削除完了を確認し、「閉じる」を選択する。

ロール作成手順

  1. アカウント1でログインし、IAMコンソールよりロールを開き、作成したロール「Lambda-List-S3-Role」をオンにした上で、「削除」を選択する。
  1. 「Lambda-List-S3-Roleを削除しますか?」の最下部の入力ボックスに「Lambda-List-S3-Role」を入力し、「削除」を選択する。
  1. 削除完了のメッセージを確認する。
タイトルとURLをコピーしました