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))
相关推荐
卖芒果的潇洒农民2 小时前
20260201 AWS VPC相关概念
云计算·aws
Genie cloud16 小时前
1Panel SSL证书申请完整教程
服务器·网络协议·云计算·ssl
JiL 奥1 天前
Ubuntu系统安装AWS SAM
云计算·aws
liyuanchao_blog1 天前
linuxptp适配记录
linux·云计算
YongCheng_Liang1 天前
从零开始学虚拟化:性能优化全指南(资源分配 + 存储网络 + 监控)
运维·云计算
YongCheng_Liang1 天前
从零开始学虚拟化:高可用与灾备技术全解析(集群 + 备份 + 异地灾备)
运维·云计算
珠海西格2 天前
“主动预防” vs “事后补救”:分布式光伏防逆流技术的代际革命,西格电力给出标准答案
大数据·运维·服务器·分布式·云计算·能源
xianyinsuifeng2 天前
RAG + Code Analysis 的标准路线
数据仓库·自动化·云计算·原型模式·aws
Genie cloud2 天前
在 Mac 上使用 Docker 安装宝塔并部署 LNMP 环境
macos·docker·容器·云计算
php_kevlin2 天前
阿里云AI接口接口
阿里云·云计算