Hoppa till innehållet
Stackship-dokumentation English

S3-lagringAnvändareMaskinöversatt

Anslut till ett lagringskonto

Rikta AWS CLI, AWS SDK:erna och andra S3-klienter mot ett lagringskonto, använd försignerade URL:er och CORS, och anslut från en arbetslast.

Vad en klient behöver

  • Slutpunkt — https:// och värdnamnet under Slutpunkt på kontots Översikt; som standard https://<account>.s3.example.com. Ett konto inställt på Endast HTTP betjänas på http:// i stället.
  • Adressering i path-style — anrop går till <endpoint>/<bucket>/<key>. Adresser med bucketen i värdnamnet (<bucket>.<endpoint>) betjänas inte, så slå på path-style i varje klient.
  • Inloggningsuppgifter — en åtkomstnyckel, eller tillfälliga inloggningsuppgifter.
  • Region — vilket värde som helst, till exempel us-east-1. Servern kontrollerar signaturen med den region som klienten signerade med.

Anrop måste signeras med AWS Signature Version 4, och klientens klocka får skilja högst 15 minuter från serverns.

Inloggningsuppgifter

Inloggningsuppgift Åtkomstnyckel-ID Behöver också
Åtkomstnyckel Börjar med AKIA Den hemliga åtkomstnyckeln
Tillfälliga inloggningsuppgifter Börjar med ASIA Den hemliga åtkomstnyckeln och sessionstoken

S3-klienter läser dem från de vanliga ställena — för AWS CLI och SDK:erna variablerna AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY och AWS_SESSION_TOKEN, eller en profil.

AWS CLI

bash
export AWS_ACCESS_KEY_ID=<access-key-id>
export AWS_SECRET_ACCESS_KEY=<secret-access-key>
export AWS_DEFAULT_REGION=us-east-1
aws configure set default.s3.addressing_style path

ENDPOINT=https://my-storage.s3.example.com
aws --endpoint-url "$ENDPOINT" s3 ls
aws --endpoint-url "$ENDPOINT" s3 cp ./report.pdf s3://my-bucket/reports/report.pdf
aws --endpoint-url "$ENDPOINT" s3 sync ./site s3://my-bucket/site

Python

python
import boto3
from botocore.config import Config

s3 = boto3.client(
    "s3",
    endpoint_url="https://my-storage.s3.example.com",
    aws_access_key_id="<access-key-id>",
    aws_secret_access_key="<secret-access-key>",
    region_name="us-east-1",
    config=Config(s3={"addressing_style": "path"}),
)
s3.upload_file("report.pdf", "my-bucket", "reports/report.pdf")

JavaScript

Med AWS SDK for JavaScript v3:

javascript
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";

const s3 = new S3Client({
  endpoint: "https://my-storage.s3.example.com",
  region: "us-east-1",
  forcePathStyle: true,
  credentials: { accessKeyId: "<access-key-id>", secretAccessKey: "<secret-access-key>" },
});
await s3.send(new PutObjectCommand({ Bucket: "my-bucket", Key: "hello.txt", Body: "Hello" }));

Försignerade URL:er

En försignerad URL låter någon utan inloggningsuppgifter läsa eller ladda upp ett objekt tills den slutar gälla. Servern godtar dem; skapa dem med din klient, till exempel:

bash
aws --endpoint-url "$ENDPOINT" s3 presign s3://my-bucket/reports/report.pdf --expires-in 3600

En URL som signerats med tillfälliga inloggningsuppgifter slutar fungera när de inloggningsuppgifterna går ut. Servern sätter ingen övre gräns för själva giltighetstiden: en URL som signerats med en åtkomstnyckel fungerar tills den går ut eller nyckeln inaktiveras eller tas bort.

CORS

En webbsida som anropar lagringskontot från webbläsaren — för att ladda upp med en försignerad URL, till exempel — behöver ha sitt ursprung på kontots lista. Lägg till det under Ytterligare CORS-ursprung, i Konfiguration → Nätverk & säkerhet, som schema, värd och valfri port, till exempel https://app.example.com. Portalens eget ursprung är alltid tillåtet.

Tillåtna ursprung får använda GET, HEAD, PUT, POST och DELETE. Ett anrop från webbläsaren med något annat ursprung avvisas. CORS-regler per bucket (PutBucketCors) stöds inte.

Anslut från en arbetslast

Arbetslaster når kontot via dess HTTPS-slutpunkt precis som andra klienter; boundaryns nätverksregler tillåter utgående HTTPS. De tillåter ingen utgående trafik på port 80, så ett konto med Endast HTTP går inte att nå från arbetslaster. Håll inloggningsuppgifterna utanför konfigurationen:

  1. Lägg åtkomstnyckel-ID:t och den hemliga åtkomstnyckeln i ett valv som två hemligheter — se Lägg till en hemlighet.
  2. Referera båda från arbetslasten, till exempel som S3_ACCESS_KEY_ID och S3_SECRET_ACCESS_KEY — se Hemligheter i appar och funktioner eller Hemligheter i containerinstanser.
  3. Lägg slutpunkten i en vanlig inställning, till exempel miljövariabeln S3_ENDPOINT.

En app läser sina hemligheter från /secrets/env.json; en funktion får dem som miljövariabler med prefixet STSH_. I en Python-app:

python
import json
import os

import boto3
from botocore.config import Config

secrets = json.load(open("/secrets/env.json"))
s3 = boto3.client(
    "s3",
    endpoint_url=os.environ["S3_ENDPOINT"],
    aws_access_key_id=secrets["S3_ACCESS_KEY_ID"],
    aws_secret_access_key=secrets["S3_SECRET_ACCESS_KEY"],
    region_name="us-east-1",
    config=Config(s3={"addressing_style": "path"}),
)

När anrop misslyckas

Svar Vanlig orsak
403 En fel eller felskriven hemlighet; en nyckel som är inaktiverad eller borttagen; en klientklocka som skiljer mer än 15 minuter; en bucket i värdnamnet i stället för i sökvägen; eller, för CreateBucket och DeleteBucket, att Tillåt bucket-livscykel via S3-API är avstängt
404 NoSuchBucket för en bucket du nyss skapade Servern uppdaterar sin lista över buckets med några sekunders mellanrum; försök igen
405 eller ett annat fel En S3-operation som servern inte stöder — se Operationer som stöds
507 InsufficientStorage Uppladdningen skulle ta kontot över dess kvot — se Kvot