У меня есть лямбда-функция в Python и DynamodB.Когда я выполняю вызов Dynamodb из функции-обработчика лямбды, этот вызов успешен.Но вызов Dynamodb вне функции-обработчика лямбды не успешен и дает исключение для отказа в доступе.
Допустим, у меня есть таблица «Список» в Dynamodb.Я поместил элемент в Dynamodb в функции-обработчике лямбда.Код работает нормально и элемент добавляется в БД.
#lambdaModule
import boto3
class LambdaFunction:
def lambda_handler(self, event, context):
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('List')
table.put_item(
Item={
'username': 'janedoe',
'first_name': 'Jane',
'last_name': 'Doe',
'age': 25,
'account_type': 'standard_user',
}
)
Но когда я пытаюсь добавить элемент в базу данных из-за пределов лямбды, это дает мне ошибку отказа в доступе.
import boto3
class LambdaFunction:
def lambda_handler(self, event, context):
#Some logic
#Accessing dynamodb from outside of lambda function.
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('List')
table.put_item(
Item={
'username': 'janedoe',
'first_name': 'Jane',
'last_name': 'Doe',
'age': 25,
'account_type': 'standard_user',
}
)
Над кодом выдается следующая ошибка отказа в доступе
"[ERROR] VerboseClientError: An error occurred (AccessDeniedException) on request (BA2U74TQ90HACN013TMF2BGEENVV4KQNSO5AEMVJF66Q9ASUAAJG) on table
(dev02-up-svc-fss-stack-BlockLists-1DRNZPW6GRDV0) when calling the DescribeTable operation: Traceback (most recent call last): File \
"/var/lang/lib/python3.7/imp.py\", line 234, in load_module return load_source(name, filename, file) File \"/var/la
ng/lib/python3.7/imp.py\", line 171, in load_source module = _load(spec) File \"<frozen importlib._bootstrap>\", line
696, in _load File \"<frozen importlib._bootstrap>\", line 677, in _load_unlocked File \"<frozen importlib._bootstrap_external>\",
line 728, in exec_module File \"<frozen importlib._bootstrap>\", line 219, in _call_with_frames_removed File \"/var/task/score.py\",
line 179, in <module> class ScoreService(Service): File \"/var/task/score.py\", line 180, in ScoreService  
; ent = _name_dob_list.match(\"first_name\", \"last_name\", \"2000-12-12\") File \"/var/task/lists.py\", line 449, in match
obj = BlockLists.match(self.name, attribs, self.params_meta) File \"/var/task/lists.py\", line 359, in match params_a
s_string) File \"/var/task/pynamodb/models.py\", line 485, in get hash_key, range_key = cls._serialize_keys(hash_key, range_k
ey) File \"/var/task/pynamodb/models.py\", line 1372, in _serialize_keys hash_key = cls._hash_key_attribute().serialize(hash_k
ey) File \"/var/task/pynamodb/models.py\", line 1219, in _hash_key_attribute hash_keyname = cls._get_meta_data().hash_keyname&n
bsp; File \"/var/task/pynamodb/models.py\", line 1262, in _get_meta_data cls._meta_table = MetaTable(cls._get_connection().describe_ta
ble()) File \"/var/task/pynamodb/connection/table.py\", line 263, in describe_table return self.connection.describe_table(self.t
able_name) File \"/var/task/pynamodb/connection/base.py\", line 659, in describe_table tbl = self.get_meta_table(table_name, ref
Я дал полный доступ к БД в файле template.yaml.
LambdaFunction:
Type: AWS::Serverless::Function
Properties:
Handler: lambdaModule.lambda_handler
Events:
ScoreEvent:
Type: Api
Properties:
Path: /score
Method: POST
RestApiId: !Ref FraudScoreAPI
Policies:
- AmazonDynamoDBFullAccess