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))
相关推荐
yunlaodacom12 小时前
腾讯云国际站服务代理商:CVM连接TencentDB失败排查指南
云计算·php·腾讯云
云宏信息13 小时前
超融合和存算分离怎么选?从性能、可靠性、扩展、成本四个维度讲述如何精准匹配架构选型 | 附企业降本轻量云方案
运维·服务器·架构·云计算
腾讯云大数据20 小时前
腾讯云+TBDS+智算平台:多模态数据处理与机器学习一体化实践
大数据·机器学习·云计算·腾讯云
知已难寻21 小时前
00 · OpenStack 总纲——从云计算到 OpenStack 全景
运维·服务器·云原生·云计算·负载均衡·openstack·perl
大力财经21 小时前
山东山大华天软件与阿里云达成合作,旗下产品CrownCAD已接入Qoder
人工智能·阿里云·云计算
长不大的杨瑞杰1 天前
OpenCode v2 多源上下文实战:Websearch、References、Attachments 与缓存预热
人工智能·安全·云计算·软件工程·devops
知已难寻2 天前
第 5 篇 · 云原生生态与实践:微服务、DevOps、可观测性与 Serverless
大数据·linux·服务器·微服务·云原生·云计算·devops
Vitaliy Kostrov(柯维远)2 天前
Multi-CDN 决策闭环:QoE、成本、安全与内容正确性如何进入同一个策略引擎?
安全·网络安全·云计算·音视频·负载均衡·cdn
长不大的杨瑞杰2 天前
OpenCode v2 远程开发实战:Web UI、Pair、SSH 隧道与 OpenTunnel 安全接入
人工智能·安全·云计算·软件工程·devops
T量子永生2 天前
Android SISO 分布式编译集群配置方案
android·分布式·云计算·源代码管理