paint-brush
複数のユーザー向けに AWS WorkMail のバックアップを自動化する方法by@th3n00bc0d3r
238

複数のユーザー向けに AWS WorkMail のバックアップを自動化する方法

Muhammad Bilal15m2024/05/27
Read on Terminal Reader

AWS WorkMail は、セキュリティ、信頼性、使いやすさを兼ね備えた強力なメールおよびカレンダー サービスです。AWS WorkMail を活用することで、組織はメール インフラストラクチャの管理の複雑さを気にすることなく、コア アクティビティに集中できます。このチュートリアルでは、複数のユーザーの Amazon WorkMail バックアップを自動化し、最大 10 個の同時メールボックス エクスポート ジョブを処理するプロセスについて説明します。
featured image - 複数のユーザー向けに AWS WorkMail のバックアップを自動化する方法
Muhammad Bilal HackerNoon profile picture
0-item

AWS WorkMail は、セキュリティ、信頼性、使いやすさを兼ね備えた強力なメールおよびカレンダーサービスです。AWS サービスとの統合と既存のメールクライアントとの互換性により、セキュリティとコンプライアンスを確保しながらメールとカレンダーの管理を合理化したい企業にとって魅力的な選択肢となっています。AWS WorkMail を活用することで、組織はメールインフラストラクチャの管理の複雑さを気にすることなく、コアアクティビティに集中できます。AWS WorkMail に信頼性の高いバックアップシステムを設定することは、メールのセキュリティを確保し、簡単に回復できるようにする上で不可欠です。このチュートリアルでは、複数のユーザーの AWS WorkMail バックアップを自動化し、最大 10 個の同時メールボックスエクスポートジョブを処理するプロセスについて説明します。AWS サービスと Python を使用して、堅牢なバックアップソリューションを作成します。


ああ!CPANEL メール サーバーを使用していた頃を思い出します。その後、自分のメール サーバーをいじりました。2010 年代初頭の IP アドレスへのアクセスが制限された単一インスタンスのメール サーバーはスムーズでしたが、世界中でこれらのサーバーを利用する人が増えるにつれて、Comon、スパムやマーケティングが大量に届くようになりました。メールがスパム ボックスに送信されないようにするのは大変でした。


AWS WorkMail、セルフホスト型メールサーバー、cPanel メールサーバーのどれを選択するかは、予算、技術的専門知識、スケーラビリティのニーズ、セキュリティ要件など、いくつかの要因によって異なります。


  • AWS WorkMail は、メンテナンスのオーバーヘッドを最小限に抑えながら、スケーラブルで安全な管理された電子メールソリューションを求める企業に最適です。
  • セルフホスト型メール サーバーは、社内に技術的な専門知識があり、特定のカスタマイズのニーズがある組織に適していますが、コストとメンテナンスの労力が高くなります。
  • cPanel メール サーバーは、ユーザー フレンドリーなインターフェイスを必要とし、ある程度のメンテナンスに慣れており、バンドルされたホスティング サービスのメリットを享受できる中小企業向けにバランスの取れたアプローチを提供します。


私の主な懸念は常に次のとおりです。

安全

  • AWS WorkMail : 転送中および保存中の暗号化、AWS Key Management Service (KMS) との統合、さまざまな規制標準への準拠など、組み込みのセキュリティ機能を提供します。
  • セルフホスト型メール サーバー: セキュリティは管理者の専門知識に完全に依存します。脅威から保護するには、暗号化、スパム フィルタリング、および定期的なセキュリティ更新の構成が必要です。
  • cPanel メール サーバー: セキュリティ機能を提供しますが、セキュリティ対策の実装と維持の責任はユーザーにあります。cPanel は SSL/TLS 構成、スパム フィルタリング、ウイルス対策のツールを提供しますが、適切なセットアップと定期的な更新が不可欠です。


その後、AWS が救いの手を差し伸べてくれました。2015 年から AWS を使い始めてからは、AWS アカウントをバックアップして新しいアカウントに移行する場合を除いて、すべてが順調でした。今のところ、AWS WorkMail ではメールをローカル コンピュータや S3 にバックアップする簡単な方法が提供されていないため、信頼できるソリューションを見つけるためにインターネットを検索してきました。セキュリティ コンプライアンスの観点からは当然ですが、それでも、AWS がそのための GUI またはツールを提供することを期待しています。ブラウジングしているときに、間違いなく有料のツールに出会ったので、独自のツールを開発することにしました。AWS の経験に基づいて厳密にテストした結果、ポリシーまたは IAM ロールの問題により 1 つのサービスが他のサービスと通信できない場合、9/10 の問題が常に発生します。


これは、AWS ワークメールアカウントのバックアップを取るのに苦労しているすべての人々への私の貢献です。


バックアップはどのように機能しますか?


お客様のアカウントに IAM ロールを作成し、AWS WorkMail からのエクスポートへのアクセス権をロールに付与してから、同じロールにポリシーを添付して S3 へのアクセスを許可しました。次に、IAM ロールへのアクセス権を付与する KMS キーを作成します。S3 バケットも、適切に機能するために IAM ロールへのアクセス権が必要です。

ステップ1: AWS CLIを設定する

まず、AWS CLI がインストールされ、適切な認証情報で設定されていることを確認します。ターミナルを開いて、次のコマンドを実行します。

 aws configure

プロンプトに従って、AWS アクセスキー ID、シークレットアクセスキー、デフォルトのリージョン、出力形式を設定します。

ステップ2: 必要なAWSリソースを設定する

IAM ロール、ポリシー、S3 バケット、KMS キーを作成する必要があります。次の bash スクリプトをsetup_workmail_export.shとして保存します。

 #!/bin/bash # Configuration ROLE_NAME="WorkMailExportRole" POLICY_NAME="workmail-export" S3_BUCKET_NAME="s3.bucket.name" AWS_REGION="your-region" ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) # Create Trust Policy cat <<EOF > trust-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "export.workmail.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "$ACCOUNT_ID" } } } ] } EOF # Create IAM Role aws iam create-role --role-name $ROLE_NAME --assume-role-policy-document file://trust-policy.json # Create IAM Policy cat <<EOF > role-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::$S3_BUCKET_NAME", "arn:aws:s3:::$S3_BUCKET_NAME/*" ] }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" } ] } EOF # Attach the Policy to the Role aws iam put-role-policy --role-name $ROLE_NAME --policy-name $POLICY_NAME --policy-document file://role-policy.json # Create S3 Bucket aws s3api create-bucket --bucket $S3_BUCKET_NAME --region $AWS_REGION --create-bucket-configuration LocationConstraint=$AWS_REGION # Create Key Policy cat <<EOF > key-policy.json { "Version": "2012-10-17", "Id": "workmail-export-key", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::$ACCOUNT_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow administration of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::$ACCOUNT_ID:role/$ROLE_NAME" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" } ] } EOF # Create the KMS Key and get the Key ID and ARN using Python for JSON parsing KEY_METADATA=$(aws kms create-key --policy file://key-policy.json) KEY_ID=$(python3 -c "import sys, json; print(json.load(sys.stdin)['KeyMetadata']['KeyId'])" <<< "$KEY_METADATA") KEY_ARN=$(python3 -c "import sys, json; print(json.load(sys.stdin)['KeyMetadata']['Arn'])" <<< "$KEY_METADATA") # Update S3 Bucket Policy cat <<EOF > s3_bucket_policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::$ACCOUNT_ID:role/$ROLE_NAME" }, "Action": "s3:*" "Resource": [ "arn:aws:s3:::$S3_BUCKET_NAME", "arn:aws:s3:::$S3_BUCKET_NAME/*" ] } ] } EOF # Apply the Bucket Policy aws s3api put-bucket-policy --bucket $S3_BUCKET_NAME --policy file://s3_bucket_policy.json # Clean up temporary files rm trust-policy.json role-policy.json key-policy.json s3_bucket_policy.json # Display the variables required for the backup script cat <<EOF Setup complete. Here are the variables required for the backup script: # Print out the Variables organization_id = 'your-organization-id' user_id = 'your-user-id' s3_bucket_name = '$S3_BUCKET_NAME' s3_prefix = 'workmail-backup/' region = '$AWS_REGION' kms_key_arn = '$KEY_ARN' role_name = '$ROLE_NAME' account_id = '$ACCOUNT_ID' EOF

スクリプトを実行可能にして実行します。

 chmod +x setup_workmail_export.sh ./setup_workmail_export.sh

ステップ3: バックアップスクリプトを作成する

ここで、メールボックスを 10 個ずつ一括エクスポートする Python スクリプトを記述します。次のスクリプトをworkmail_export.pyとして保存します。

 import boto3 import json import time from datetime import datetime # Configuration organization_id = 'your-organization-id' user_emails = { 'user-id-1': '[email protected]', 'user-id-2': '[email protected]', 'user-id-3': '[email protected]', 'user-id-4': '[email protected]', 'user-id-5': '[email protected]', 'user-id-6': '[email protected]', 'user-id-7': '[email protected]', 'user-id-8': '[email protected]', 'user-id-9': '[email protected]', 'user-id-10': '[email protected]', 'user-id-11': '[email protected]', 'user-id-12': '[email protected]' # Add more user ID to email mappings as needed } s3_bucket_name = 's3.bucket.name' region = 'your-region' kms_key_arn = 'arn:aws:kms:your-region:your-account-id:key/your-key-id' role_name = 'WorkMailExportRole' account_id = 'your-account-id' # Get the current date current_date = datetime.now().strftime('%Y-%m-%d') # Set the S3 prefix with the date included s3_prefix_base = f'workmail-backup/{current_date}/' # Initialize AWS clients workmail = boto3.client('workmail', region_name=region) sts = boto3.client('sts', region_name=region) def start_export_job(entity_id, user_email): client_token = str(time.time()) # Unique client token role_arn = f"arn:aws:iam::{account_id}:role/{role_name}" s3_prefix = f"{s3_prefix_base}{user_email}/" try: response = workmail.start_mailbox_export_job( ClientToken=client_token, OrganizationId=organization_id, EntityId=entity_id, Description='Backup job', RoleArn=role_arn, KmsKeyArn=kms_key_arn, S3BucketName=s3_bucket_name, S3Prefix=s3_prefix ) return response['JobId'] except Exception as e: print(f"Failed to start export job for {entity_id}: {e}") return None def check_job_status(job_id): while True: try: response = workmail.describe_mailbox_export_job( OrganizationId=organization_id, JobId=job_id ) print(f"Full Response: {response}") # Log full response for debugging state = response.get('State', 'UNKNOWN') print(f"Job State: {state}") if state in ['COMPLETED', 'FAILED']: break except Exception as e : print(f"Error checking job status for {job_id}: {e}") time.sleep(30) # Wait for 30 seconds before checking again return state def export_mailboxes_in_batches(user_emails, batch_size=10): user_ids = list(user_emails.keys()) for i in range(0, len(user_ids), batch_size): batch = user_ids[i:i+batch_size] job_ids = [] for user_id in batch: user_email = user_emails[user_id] job_id = start_export_job(user_id, user_email) if job_id: print(f"Started export job for {user_email} with Job ID: {job_id}") job_ids.append((user_email, job_id)) for user_email, job_id in job_ids: state = check_job_status(job_id) if state == 'COMPLETED': print(f"Export job for {user_email} completed successfully") else: print(f"Export job for {user_email} failed with state: {state}") def main(): export_mailboxes_in_batches(user_emails) if __name__ == "__main__": main()

プレースホルダーを実際の AWS WorkMail 組織 ID、ユーザー ID とメールのマッピング、S3 バケット名、リージョン、KMS キー ARN、ロール名、AWS アカウント ID に置き換えます。


ステップ4: バックアップスクリプトを実行する

Boto3 がインストールされていることを確認してください:

 pip install boto3

次に、Python スクリプトを実行します。

 python workmail_export.py 


メールボックスのインポート

import boto3 import json import time # Configuration organization_id = 'your-organization-id' user_import_data = { 'user-id-1': '[email protected]', 'user-id-2': '[email protected]', 'user-id-3': '[email protected]', 'user-id-4': '[email protected]', 'user-id-5': '[email protected]', 'user-id-6': '[email protected]', 'user-id-7': '[email protected]', 'user-id-8': '[email protected]', 'user-id-9': '[email protected]', 'user-id-10': '[email protected]', 'user-id-11': '[email protected]', 'user-id-12': '[email protected]' # Add more user ID to email mappings as needed } s3_bucket_name = 's3.bucket.name' s3_object_prefix = 'workmail-backup/' # Prefix for S3 objects (folders) region = 'your-region' role_name = 'WorkMailImportRole' account_id = 'your-account-id' # Initialize AWS clients workmail = boto3.client('workmail', region_name=region) sts = boto3.client('sts', region_name=region) def start_import_job(entity_id, user_email): client_token = str(time.time()) # Unique client token role_arn = f"arn:aws:iam::{account_id}:role/{role_name}" s3_object_key = f"{s3_object_prefix}{user_email}/export.zip" try: response = workmail.start_mailbox_import_job( ClientToken=client_token, OrganizationId=organization_id, EntityId=entity_id, Description='Import job', RoleArn=role_arn, S3BucketName=s3_bucket_name, S3ObjectKey=s3_object_key ) return response['JobId'] except Exception as e: print(f"Failed to start import job for {entity_id}: {e}") return None def check_job_status(job_id): while True: try: response = workmail.describe_mailbox_import_job( OrganizationId=organization_id, JobId=job_id ) state = response.get('State', 'UNKNOWN') print(f"Job State: {state}") if state in ['COMPLETED', 'FAILED']: break except Exception as e: print(f"Error checking job status for {job_id}: {e}") time.sleep(30) # Wait for 30 seconds before checking again return state def import_mailboxes_in_batches(user_import_data, batch_size=10): user_ids = list(user_import_data.keys()) for i in range(0, len(user_ids), batch_size): batch = user_ids[i:i+batch_size] job_ids = [] for user_id in batch: user_email = user_import_data[user_id] job_id = start_import_job(user_id, user_email) if job_id: print(f"Started import job for {user_email} with Job ID: {job_id}") job_ids.append((user_email, job_id)) for user_email, job_id in job_ids: state = check_job_status(job_id) if state == 'COMPLETED': print(f"Import job for {user_email} completed successfully") else: print(f"Import job for {user_email} failed with state: {state}") def main(): import_mailboxes_in_batches(user_import_data) if __name__ == "__main__": main()


これらの手順に従うことで、AWS WorkMail メールボックスをバックアップし、最大 10 件の同時エクスポートジョブを処理する自動システムをセットアップできました。このソリューションにより、メールは S3 バケットに安全に保存され、ユーザーのメールと日付で整理され、KMS キーで暗号化されます。このセットアップにより、組織のメールデータに堅牢でスケーラブルなバックアップ戦略が提供されます。


Github リポジトリ: https://github.com/th3n00bc0d3r/AWS-WorkMail-Backup


LinkedInで気軽に連絡してください。また、いつでもコーヒーをご馳走していただけます。