👌

現場で困らない!相手から『S3バケットはこちらで用意する、IAMはそちらで準備してarnを教えてほしい』と言われたときの対処法

2024/09/27に公開

自社サーバーから他社S3バケットへの安全なファイル転送

こんにちは、CareNetのエンジニアのKYです。
自社のサーバーから他社S3バケットにファイルを送信する際、相手からIAMユーザーのアクセスキーIDやシークレットアクセスキーを受け取り、直接送信する方法は手軽ですが、相手側のセキュリティポリシーによってそれが不可能な場合があります。
その場合、自社のAWS IAMユーザーを使ってファイルを送信することになるのですが、その権限設定や、相手が必要とする自社IAMユーザー情報、またそれに伴う相手のバケット設定情報等を考慮する必要があります。
本ブログでは、IAMユーザーとバケット設定からPythonプログラムによるファイル送信までのプロセスを一括で説明します。


STEP1. 前提条件

  • 自社サーバーにPython3がインストールされていること
  • 自社と他社の両方で必要な IAM ロールとポリシーを作成する権限を持っていること
  • 他社バケット情報(バケット名、ファイルパス)が提供されていること

STEP2. 自社AWSのIAMユーザー権限設定

まずは、自社のAWS IAMユーザーに適切な権限を付与する必要があります。以下はポリシーの例です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::他社バケット名/ファイルパス/*"
            ]
        }
    ]
}

上記ポリシーをIAMユーザーに適用し、相手のバケット内の指定されたパスにオブジェクトを作成できるようにします。


STEP3. 相手にわたす自社IAMユーザー情報と権限設定

自社IAMユーザーのARNを提供

自社IAMユーザーのARNを、送信先の相手に提供します。

  • 自社IAMユーザーARN: arn:aws:iam::123456789012:user/ユーザー名

相手側で必要な設定内容

相手側では自社ARNを使って、バケットポリシーに下記のような許可を設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/ユーザー名"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::他社バケット名/ファイルパス/*"
        }
    ]
}

STEP4. ファイルを送信するプログラム(Python)

以下にPythonプログラムの例を示します。このスクリプトを使って、自社サーバーから相手のS3バケットへファイルを送信します。

import boto3

# 自社の IAM クレデンシャル
AWS_ACCESS_KEY_ID = 'YOUR_ACCESS_KEY_ID'
AWS_SECRET_ACCESS_KEY = 'YOUR_SECRET_ACCESS_KEY'

# 他社の S3 バケット情報
DESTINATION_BUCKET_NAME = 'destination-bucket'
DESTINATION_FILE_PATH = 'path/to/destination/file.txt'

# ファイルを送信するソースファイルパス
SOURCE_FILE_PATH = 'path/to/source/file.txt'

# S3 クライアントの作成
s3 = boto3.client('s3', aws_access_key_id=AWS_ACCESS_KEY_ID,
                         aws_secret_access_key=AWS_SECRET_ACCESS_KEY)

# ファイルのアップロード
s3.upload_file(SOURCE_FILE_PATH, DESTINATION_BUCKET_NAME, DESTINATION_FILE_PATH)

まとめ

これで、IAMのリソース管理は自社で、バケットへのアクセス権の管理は他社で という切り分けが可能です。
相手からS3バケット情報しかもらえない場合、参考になれば幸いです。


CareNet Engineers

Discussion