AWS的S3上傳

注意:首先要先把秘鑰設置配置好,本文是使用powershell的全局配置上拋的,原理是使用aws 的CLI,在獲取憑證後,再根據獲取的臨時憑證上拋到S3上

复制代码
import subprocess
import json
import os

# 执行 assume-role
aws_exe = r"C:\Program Files\Amazon\AWSCLIV2\aws.exe"
cmd = [
    aws_exe,
    "sts", "assume-role",
    "--role-arn", "",
    "--role-session-name", "MetaUpload"
]

try:
    # 1. 获取临时凭证
    result = subprocess.run(cmd, capture_output=True, text=True, check=True)
    creds = json.loads(result.stdout)['Credentials']

    # 提取字段
    access_key = creds['AccessKeyId']
    secret_key = creds['SecretAccessKey']
    session_token = creds['SessionToken']

    # 生成 PowerShell 命令(带引号转义)- 保留手动执行的功能
    print("✅ 复制以下命令到你的 PowerShell 中执行(手动上传用):\n")
    print(f'$ENV:AWS_ACCESS_KEY_ID="{access_key}"')
    print(f'$ENV:AWS_SECRET_ACCESS_KEY="{secret_key}"')
    print(f'$ENV:AWS_SESSION_TOKEN="{session_token}"')
    print('$ENV:AWS_USE_DUALSTACK_ENDPOINT=$true')
    print("\n✅ 凭证已成功获取并格式化!")

    # 构建包含临时凭证的环境变量(继承当前系统环境变量,再覆盖 AWS 相关)
    env = os.environ.copy()
    env['AWS_ACCESS_KEY_ID'] = access_key
    env['AWS_SECRET_ACCESS_KEY'] = secret_key
    env['AWS_SESSION_TOKEN'] = session_token
    env['AWS_USE_DUALSTACK_ENDPOINT'] = 'true'

    # ====================== 新增:S3 LS 操作(上传前查看目标目录)======================
    # 定义要查看的S3目录(取上传目标的目录部分,方便验证路径)
    s3_ls_path = ""
    # 构建s3 ls命令
    s3_ls_cmd = [
        aws_exe,
        "s3", "ls",
        s3_ls_path  # 可改为 s3://mfghwteste-landing-bucket/ 查看整个桶
    ]
    print(f"\n🔍 执行 S3 LS 查看目录:{s3_ls_path}")
    ls_result = subprocess.run(s3_ls_cmd, capture_output=True, text=True, env=env)
    if ls_result.returncode == 0:
        print("✅ S3 LS 执行成功,目录内容:")
        print(ls_result.stdout if ls_result.stdout else "该目录暂无文件")
    else:
        print("⚠️ S3 LS 执行警告(非致命,可能目录不存在):")
        print("STDERR:", ls_result.stderr)
    # ==================================================================================

    # 2. 上传 S3(核心:通过环境变量传递凭证)
    local_file = r".\test2.txt"
    s3_uri = ""

    s3_cmd = [
        aws_exe,
        "s3", "cp",
        local_file, s3_uri
    ]

    # 关键:通过 env 参数传递带凭证的环境变量
    print(f"\n📤 开始上传文件:{local_file} -> {s3_uri}")
    cp_result = subprocess.run(s3_cmd, capture_output=True, text=True, env=env)

    if cp_result.returncode == 0:
        print("✅ 上传成功!")

        # ====================== 新增:上传后再次LS验证文件是否存在 ======================
        print(f"\n🔍 上传后再次查看目录:{s3_ls_path}")
        post_ls_result = subprocess.run(s3_ls_cmd, capture_output=True, text=True, env=env)
        if post_ls_result.returncode == 0:
            print("✅ 上传后目录内容:")
            print(post_ls_result.stdout if post_ls_result.stdout else "目录仍为空(异常)")
        else:
            print("⚠️ 上传后LS执行失败:")
            print("STDERR:", post_ls_result.stderr)
        # ==============================================================================
    else:
        print("❌ 上传失败:")
        print("STDERR:", cp_result.stderr)
        print("命令详情:", " ".join(s3_cmd))  # 方便排查

except subprocess.CalledProcessError as e:
    print("❌ assume-role 失败:")
    print("STDERR:", e.stderr)
    print("命令详情:", " ".join(cmd))
except KeyError as e:
    print(f"❌ 凭证解析失败:缺少字段 {e}")
    print("原始输出:", result.stdout)
except Exception as ex:
    print("❌ 错误:", str(ex))
相关推荐
Soari13 分钟前
【突发暴更】Claude Code v2.1.208 :无障碍辅助模式正式上线、Vim 连击热键出逃、大修内存泄漏与跨域 AWS SSO 登录崩溃!
编辑器·vim·aws·claude code
xywww1684 小时前
AWS 账号安全加固:Root 与 IAM 用户的 MFA 设置实操清单
安全·云计算·aws
云服务器代理商9 小时前
从 GCP 迁移到 AWS:服务对照、架构改造与分阶段迁移f方案
云计算·aws·谷歌云·gcp·亚马逊云·云服务器代理·云服务器迁移
Database_Cool_1 天前
日志存储降本首选:阿里云 Lindorm 冷热分层替代 Elasticsearch
elasticsearch·阿里云·云计算
胖胖雕2 天前
利用阿里云与docker部署Certimate
阿里云·docker·云计算
AliCloudROS2 天前
一次真实录屏:我只说每月别超过 200 块,小程序后端就搭好了
运维·人工智能·云计算
buligbulig2 天前
如何在云计算中使用虚拟磁盘?
云计算
赛博三把手3 天前
Claude Fable 5 API 调用完整指南:官方、AWS、OpenRouter 与中转平台对比(2026 最新)
网络·云计算·aws
weixin_462901973 天前
从零跑通:阿里云 ECS + 百炼 MaaS 大模型答题卡识别全流程
阿里云·云计算
tiancaijiben3 天前
阿里云ECS云服务器部署Vue打包静态网站:Nginx路由重定向完整配置
云计算