# S3

> Uploads generated static sites or files (like slides) to AWS S3 or S3-compatible services (MinIO, Aliyun OSS, etc.) for public access. Use this skill when the user wants to publish or deploy their content to the cloud.

- Skill: `majiayu000/s3` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/s3`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/s3/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/s3

---


# S3 Deployment Skill

## Instructions

This skill handles uploading a local directory (e.g., generated slides) to an AWS S3 bucket or any S3-compatible object storage (e.g., MinIO, Aliyun OSS, Tencent COS) for static website hosting.

1.  **Prerequisites**:
    *   Ensure the user has valid credentials in their environment:
        *   `S3_ACCESS_KEY_ID`
        *   `S3_SECRET_ACCESS_KEY`
        *   `S3_BUCKET` (Optional if provided as an argument)
        *   `S3_REGION` (Optional)
        *   `S3_ENDPOINT_URL` (Required for non-AWS services like MinIO or Aliyun OSS)
        *   `S3_CUSTOM_DOMAIN` (Optional, overrides the generated URL)
    *   Ensure `boto3` is installed in the environment. If not, install it.
    *   Identify the source directory (e.g., `slides/<ppt-name>/dist/`) and the target S3 bucket name.

2.  **Implementation**:
    *   Create a Python script using `boto3` to walk through the source directory.
    *   Configure the S3 client with `endpoint_url` if provided, to support S3-compatible providers.
    *   Upload each file, maintaining the relative path structure.
    *   **Crucial**: specific `ContentType` must be set for each file based on its extension (e.g., `text/html` for `.html`, `text/css` for `.css`, `image/png` for `.png`) so that the browser renders it correctly.
    *   Make the objects public if the bucket policy allows or requires ACL (optional, based on bucket configuration).
    *   Print the final website URL.

## Usage

Use the bundled script to upload files:

```bash
# Explicit bucket name
uv run {baseDir}/scripts/upload_to_s3.py "slides/my-presentation/dist" "my-bucket" --prefix "presentations/my-presentation"

# Using S3_BUCKET from environment
uv run {baseDir}/scripts/upload_to_s3.py "slides/my-presentation/dist" --prefix "presentations/my-presentation"
```

## Usage Guidelines

*   **Bucket Name**: Check if `S3_BUCKET` is set in environment. If not, ask the user for the S3 Bucket name.
*   **Endpoint URL**: Check if the user is using a non-AWS provider (like MinIO or Aliyun). If so, request or verify the `endpoint_url`.
*   **Source Path**: Default to looking for `dist` folders in `slides/` if not specified.

