AWS S3
AWS S3
Teorie
Amazon S3 (Simple Storage Service) este un serviciu de stocare în cloud oferit de Amazon Web Services (AWS) care furnizează stocare scalabilă și securizată pentru date de orice tip și volum. Este utilizat pentru a stoca și recupera orice cantitate de date în orice moment, de oriunde pe web.
Iată câteva caracteristici principale ale Amazon S3:
- Stocare scalabilă: S3 poate scala automat pentru a gestiona orice volum de date, de la câțiva kilobyți până la petabytes.
- Accesibilitate globală: Datele stocate în S3 sunt accesibile din orice locație prin intermediul internetului.
- Durabilitate și disponibilitate: S3 oferă o durabilitate de 99,999999999% (11 nouă) și o disponibilitate de 99,99% a obiectelor stocate.
- Securitate: S3 oferă diverse opțiuni de securitate, inclusiv criptarea datelor în repaus și în tranzit, și controale de acces fine-grained prin intermediul politicilor de securitate și al permisiunilor.
- Costuri eficiente: S3 oferă mai multe clase de stocare pentru a ajuta utilizatorii să optimizeze costurile, inclusiv opțiuni pentru stocare frecvent accesată, stocare de lungă durată, stocare pentru backup-uri, și arhivare.
- Integrare cu alte servicii AWS: S3 se integrează ușor cu alte servicii AWS, cum ar fi EC2 (Elastic Compute Cloud), RDS (Relational Database Service), și Lambda pentru a construi aplicații complexe și scalabile.
Practică
Notă: pentru a urmari acest tutorial in mod interactiv poti lansa urmatorul sandbox: AWS Cloud
Deschide o fereastra terminal in VSCode si introdu urmatoarea comanda:
moto_server
Dupa ce executi aceasta comanda in fereastra terminalului va aparea urmatorul output:
* Running on http://127.0.0.1:5000
Deschide un terminal într-o fereastră nouă sau poți împărți terminalul curent (split
)
În fereastra nouă, introdu următoarea comandă:
export AWS_ENDPOINT_URL=http://127.0.0.1:5000
Această comandă setează un endpoint pentru aws-cli.
Un endpoint este URL-ul punctului de intrare pentru un serviciu web AWS.
Astfel, atunci când vom executa o comandă folosind aws-cli,
cererea va fi interceptată și procesată de serverul Moto,
în loc să fie trimisă către serverele regionale sau globale AWS.
În primul rând, să verificăm dacă setarea noastră funcționează corect.
Pentru aceasta, putem executa orice comandă disponibilă în AWS.
Haideți să rulăm comanda care ne arată identitatea sub care suntem logați:
aws sts get-caller-identity
Executarea acestei comenzi ar trebui să returneze următorul mesaj:
You must specify a region. You can also configure your region bu running "aws configure".
Acest mesaj de eroare indică faptul că AWS CLI nu a fost configurat și SDK-ul nu știe care este regiunea AWS selectată sau implicită. Pentru a rezolva această problemă, putem executa comanda:
aws configure
Această comandă va solicita câteva valori pe care trebuie să le introducem.
De obicei, aceste valori sunt credențiale valide, dar deoarece folosim o configurare locală cu Moto,
aceste credențiale nu au impact funcțional.
Din acest motiv, putem introduce orice valori pentru AWS Access Key ID
și AWS Secret Access Key
, așa cum se vede mai jos:
AWS Access Key ID [None]: test
AWS Secret Access Key [None]: test
Default region name [None]: us-east-1
Default output format [None]: json
Acum, să încercăm din nou să executăm comanda anterioară:
aws sts get-caller-identity
De data aceasta, nu ar trebui să mai avem eroare și vom vedea un output similar cu cel de mai jos:
{
"UserId": "AKIAIOSFODNN7EXAMPLE",
"Account": "1234556789012",
"Arn": "arn:aws:sts::1234556789012:user/moto"
}
Acest output indică un cont generat aleator de Moto, similar cu un număr de cont AWS,
precum și un ARN (Amazon Resource Name) pentru identitatea apelantă.
În terminalul unde rulează serverul Moto, putem valida primirea unei cereri din partea AWS CLI:
127.0.0.1 - - [25/Jun/2024 17:31:47] "POST / HTTP/1.1" 200
AWS S3
Într-un fișier nou, introduceți urmatorul cod:
import boto3
import io
def main():
# Configurarea clientului boto3 pentru a utiliza endpoint-ul local moto
s3 = boto3.client("s3", region_name="us-east-1", endpoint_url="http://localhost:5000")
# Crearea unui bucket
bucket_name = "example-bucket"
s3.create_bucket(Bucket=bucket_name)
# Listarea bucket-urilor pentru a verifica crearea
response = s3.list_buckets()
print("Buckets existente:")
for bucket in response["Buckets"]:
print(f" {bucket['Name']}")
# Crearea unui fișier de test
file_content = "Acesta este un fișier de test."
file_obj = io.BytesIO(file_content.encode("utf-8"))
# Încărcarea fișierului
s3.upload_fileobj(file_obj, bucket_name, "test_file.txt")
# Listarea obiectelor în bucket pentru a verifica încărcarea
response = s3.list_objects_v2(Bucket=bucket_name)
print("Fișiere în bucket:")
for obj in response.get("Contents", []):
print(f" {obj['Key']}")
# Descărcarea fișierului
download_obj = io.BytesIO()
s3.download_fileobj(bucket_name, "test_file.txt", download_obj)
download_obj.seek(0)
print("Conținutul fișierului descărcat:")
print(download_obj.read().decode("utf-8"))
# Ștergerea fișierului
s3.delete_object(Bucket=bucket_name, Key="test_file.txt")
# Verificarea ștergerii
response = s3.list_objects_v2(Bucket=bucket_name)
print("Fișiere în bucket după ștergere:")
for obj in response.get("Contents", []):
print(f" {obj['Key']}")
if __name__ == "__main__":
main()
Listarea bucket-urilor
s3 = boto3.client("s3", region_name="us-east-1", endpoint_url="http://localhost:5000")
- Creează un client S3 utilizând boto3. Acest client este configurat să utilizeze endpoint-ul local moto, specificat prin endpoint_url.
s3.create_bucket(Bucket=bucket_name)
- Creează un bucket S3 cu numele specificat
response = s3.list_buckets)
- Obține o listă a bucket-urilor existente.
for bucket in response["Buckets"]
- Iterează prin lista de bucket-uri și afișează numele acestora.
Crearea unui fișier și încărcarea acestuia
file_content = "Acesta este un fișier de test
- Conținutul fișierului de test.
file_obj = io.BytesIO(file_content.encode("utf-8"))
- Creează un obiect BytesIO
pentru fișierul de test.
s3.upload_fileobj(file_obj, bucket_name, "test_file.txt")
- Încarcă fișierul în bucket
Listarea obiectelor din Bucket
response = s3.list_objects_v2(Bucket=bucket_name)
- Obține o listă a obiectelor din bucket.
for obj in response.get("Contents", [])
- Iterează prin lista de obiecte și afișează cheile acestora.
Descărcarea unui fișier
download_obj = io.BytesIO()
- Creează un obiect BytesIO pentru descărcarea fișierului.
s3.download_fileobj(bucket_name, "test_file.txt", download_obj)
- Descarcă fișierul din bucket.
download_obj.seek(0)
- Repozitionează cursorul la începutul obiectului BytesIO.
print(download_obj.read().decode("utf-8"))
- Afișează conținutul fișierului descărcat.
Ștergerea unui fișier
s3.delete_object(Bucket=bucket_name, Key="test_file.txt")
- Șterge fișierul din bucket.
Verificarea ștergerii
response = s3.list_objects_v2(Bucket=bucket_name)
- Verifică lista obiectelor din bucket după ștergere.
for obj in response.get("Contents", [])
- Iterează prin lista de obiecte și afișează cheile acestora.
Similar, aceleași operațiuni pot fi realizate prin intermediul liniei de comanda:
Înainte de a rula comenzile AWS CLI, asigurați-vă că aveți configurat AWS CLI pentru a utiliza endpoint-ul local moto:
export AWS_ENDPOINT_URL=http://127.0.0.1:5000
1. Crearea unui Bucket
aws s3api create-bucket --bucket example-bucket
aws s3api create-bucket --bucket example-bucket
- Creează un bucket S3 cu numele example-bucket.
2. Listarea Bucket-urilor
aws s3api list-buckets
3. Încărcarea unui Fișier
Creăm un fișier de test pe disc:
echo "Acesta este un fișier de test." > test_file.txt
echo "Acesta este un fișier de test." > test_file.txt
- Creează un fișier de test cu conținutul specificat.
Încărcăm fișierul în bucket:
aws s3 cp test_file.txt s3://example-bucket/test_file.txt
aws s3 cp test_file.txt s3://example-bucket/test_file.txt
- Încarcă fișierul test_file.txt în bucket-ul example-bucket.
4. Listarea Obiectelor din Bucket
aws s3 ls s3://example-bucket/
aws s3 ls s3://example-bucket/
- Listează toate obiectele din bucket-ul example-bucket.
5. Descărcarea unui Fișier
aws s3 cp s3://example-bucket/test_file.txt downloaded_test_file.txt
aws s3 cp s3://example-bucket/test_file.txt downloaded_test_file.txt
- Descarcă fișierul test_file.txt
din bucket-ul example-bucket
și îl salvează ca downloaded_test_file.txt
.
Pentru a verifica conținutul fișierului descărcat:
cat downloaded_test_file.txt
cat downloaded_test_file.txt
- Afișează conținutul fișierului descărcat.
5. Ștergerea unui Fișier
aws s3 rm s3://example-bucket/test_file.txt
aws s3 rm s3://example-bucket/test_file.txt
- Șterge fișierul test_file.txt din bucket-ul example-bucket.
Acest tutorial a acoperit pașii necesari pentru a configura și utiliza moto pentru simularea AWS S3 pe un server local și a arătat cum să realizăm aceleași operațiuni atât folosind boto3 în Python, cât și AWS CLI. Aceste metode oferă flexibilitate și ușurință în dezvoltarea și testarea aplicațiilor care utilizează AWS S3, fără a interacționa direct cu serviciile reale AWS, economisind timp și costuri.