Я создаю следующую инфраструктуру для моего проекта, которая использует FastAPI для разработки API.Здесь есть два микросервиса: / user / * и / admin / *, которые считывают и обновляют данные, хранящиеся в DynamoDB.
Настройка следующая: у меня есть VPC с 2 AZ, каждый из которых содержит публичныйи частная подсеть.Каждая общедоступная подсеть имеет шлюз NAT для частной подсети в том же AZ.Интернет-шлюз подключен к VPC.Конечная точка VPC для DynamoDB создана.Кластер ECS создается с Fargate, являющимся типом запуска, а служба работает в двух частных подсетях.
Шаблон CloudFormation создается, но запрос API возвращает внутреннюю ошибку сервера.Я считаю, что проблема в том, что контейнер не имеет надлежащего доступа к таблице DynamoDB.
Ниже приведена роль IAM, которую я создал и прикрепил к контейнеру ECS (ECSTaskExecutionRole):
ECSTaskExecutionRole:
Type: AWS::IAM::Role
# Role for ECS task
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: [ecs-tasks.amazonaws.com]
Action: ['sts:AssumeRole']
Path: /
Policies:
- PolicyName: AmznECSTaskExecutionRolePolicy
PolicyDocument:
Statement:
- Effect: Allow
Action:
# ECS tasks to download images from ECR
- ecr:GetAuthorizationToken
- ecr:BatchCheckLayerAvailability
- ecr:GetDownloadUrlForLayer
- ecr:BatchGetImage
# ECS tasks to upload logs to CloudWatch
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
- logs:DescribeLogStreams
# ECS tasks to use DynamoDB
- dynamodb:Batch*
- dynamodb:Delete*
- dynamodb:DescribeTable
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:Update*
Resource: '*'
И ниже указана конечная точка VPC для DynamoDB:
DynamoDBVpcEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
VpcId: !Ref VPC
ServiceName: !Sub "com.amazonaws.${AWS::Region}.dynamodb"
VpcEndpointType: Gateway
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: '*'
Principal: '*'
Resource: '*'
RouteTableIds:
- !Ref VPCPrivateRouteTable1
- !Ref VPCPrivateRouteTable2
Я также убедился, что таблица маршрутов для частных подсетей содержит пару для конечной точки DynamoDB.
Любая помощь будет принята с благодарностью!Спасибо.