Ich möchte meine Anwendung, die lokal hervorragend funktioniert, in einem Docker-Container ausführen. Leider habe ich ein Problem mit meinem Sicherheitstoken. Anscheinend bin ich nicht richtig authentifiziert oder so.
botocore.exceptions.ClientError: An error occurred (UnrecognizedClientException) when calling the CreateTable operation: The security token included in the request is invalid.
Hier ist die Fehlermeldung, die mir Docker gibt, wenn ich diese Anwendung ausführe:
(venv) (base) remplacement@remplacements-MacBook-Pro flask-login % docker run -p 5000:5000 -v ~/.aws/credentials:/root/.aws/credentials sum_up_app
* Serving Flask app 'app.py'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://172.17.0.2:5000
Press CTRL+C to quit
[2023-10-02 09:33:14,088] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "/app/utils.py", line 66, in get_existant_summaries
summaries = table.scan()
File "/usr/local/lib/python3.8/site-packages/boto3/resources/factory.py", line 580, in do_action
response = action(self, *args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/boto3/resources/action.py", line 88, in __call__
response = getattr(parent.meta.client, operation_name)(*args, **params)
File "/usr/local/lib/python3.8/site-packages/botocore/client.py", line 530, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/local/lib/python3.8/site-packages/botocore/client.py", line 964, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (UnrecognizedClientException) when calling the Scan operation: The security token included in the request is invalid.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.8/site-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/app/app.py", line 55, in index
summaries = get_existant_summaries(user_id)
File "/app/utils.py", line 68, in get_existant_summaries
create_dynamodb_table('summaries')
File "/app/utils.py", line 106, in create_dynamodb_table
table = dynamodb.create_table(
File "/usr/local/lib/python3.8/site-packages/boto3/resources/factory.py", line 580, in do_action
response = action(self, *args, **kwargs)
File "/usr/local/lib/python3.8/site-packages/boto3/resources/action.py", line 88, in __call__
response = getattr(parent.meta.client, operation_name)(*args, **params)
File "/usr/local/lib/python3.8/site-packages/botocore/client.py", line 530, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/usr/local/lib/python3.8/site-packages/botocore/client.py", line 964, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (UnrecognizedClientException) when calling the CreateTable operation: The security token included in the request is invalid.
Der Fehler scheint hierher zu kommen:
utils.py
import openai
from PyPDF2 import PdfReader
from docx import Document
import boto3
import csv
import logging
from datetime import datetime, date
from werkzeug.utils import secure_filename
import os
from decouple import config
UPLOAD_FOLDER = 'uploads'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'zip'}
# Lisez les variables d'environnement AWS en utilisant python-decouple
aws_access_key_id = config('AWS_ACCESS_KEY_ID')
aws_secret_access_key = config('AWS_SECRET_ACCESS_KEY')
aws_region = config('AWS_REGION')
# # Configurez le client AWS avec les informations d'environnement
# session = boto3.Session(
# aws_access_key_id=aws_access_key_id,
# aws_secret_access_key=aws_secret_access_key,
# region_name=aws_region
# )
# from pymongo import MongoClient
def get_credentials_from_csv(file_path):
credentials = {}
with open(file_path, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
credentials['aws_access_key_id'] = row['aws_access_key_id']
credentials['aws_secret_access_key'] = row['aws_secret_access_key']
return credentials
def get_existant_summaries(user_id):
dynamodb = boto3.resource('dynamodb', region_name=aws_region)
try:
table = dynamodb.Table('summaries')
summaries = table.scan()
except Exception as e:
create_dynamodb_table('summaries')
summaries = []
return summaries
def create_dynamodb_table(name):
dynamodb = boto3.resource('dynamodb', region_name=aws_region)
# Table definition
table = dynamodb.create_table(
TableName=name,
KeySchema=[
{
'AttributeName': 'user_id',
'KeyType': 'HASH' # Partition key
},
{
'AttributeName': 'filename',
'KeyType': 'RANGE' # Sort key
}
],
AttributeDefinitions=[
{
'AttributeName': 'user_id',
'AttributeType': 'N'
},
{
'AttributeName': 'filename',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 10,
'WriteCapacityUnits': 10
}
)
return table
Hier ist app.py, das ich gestartet habe:
app.py
from flask import Flask, url_for, render_template, request, redirect, session, flash
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import FileField
from utils import get_existant_summaries, custom_sort, is_folder, allowed_file
from flask import Flask, flash, request, redirect, url_for
from summarizer import summup
from decouple import config, Csv
SECRET_KEY = config("SECRET_KEY")
UPLOAD_FOLDER = config("UPLOAD_FOLDER")
DATABASE_URI = config("DATABASE_URI")
app = Flask(__name__)
app.secret_key = SECRET_KEY
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['SQLALCHEMY_DATABASE_URI'] = DATABASE_URI
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True)
password = db.Column(db.String(100))
def __init__(self, username, password):
self.username = username
self.password = password
class UploadForm(FlaskForm):
file = FileField('file')
@app.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
else:
u = request.form['username']
p = request.form['password']
data = User.query.filter_by(username=u, password=p).first()
if data is not None:
session['user_id'] = data.id # Stocker l'ID de l'utilisateur dans la session
session['logged_in'] = True
return redirect(url_for('index'))
return render_template('index.html', message="Incorrect Details")