Я (AWS noob) играю с aws cdk. Я хочу создать простую службу Spring, работающую в fargate, с Dynamodb в качестве базы данных. Похоже, моя служба не может получить доступ к динамо-машине из-за отсутствия некоторых разрешений. В журналах Cloudwatch я вижу это сообщение об ошибке:
com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: User: arn:aws:sts::xxxxxxxxxx:assumed-role/MyCdkAppStack-TaskDefTaskRole1EDB4A67-xxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx is not authorized to perform: dynamodb:UpdateItem on resource: arn:aws:dynamodb:eu-central-1:xxxxxxxxxxx:table/MyDynamoDbTable (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: AccessDeniedException; Request ID: XXXXX)
Для разрешений для таблицы, я подумал, достаточно предоставить необходимые разрешения для роли задачи службы fargate:
props.dependencies.dynamoDb.grantReadWriteData(taskDefinition.taskRole);
В консоли AWS похоже, что разрешения должны быть там: когда я go для соответствующей задачи, соответствующая роль, кажется, имеет все разрешения.
Однако он не работает, поэтому, очевидно, я что-то упускаю или делаю что-то не так. Любые подсказки о том, как я могу подключить службу fargate к таблице db Dynamo в приложении cdk?
Спасибо, некоторые советы будут очень признательны:)
Edit: Извините за задержку .. Стек:
export class MyCdkAppStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props: MyCdkAppStackProps) {
super(scope, id, props);
const appId = 'myService';
const table = new Table(this, 'MyDynamoDbTable', {
tableName: 'MyDynamoDbTable',
partitionKey: {name: 'Id', type: AttributeType.STRING},
billingMode: BillingMode.PAY_PER_REQUEST,
removalPolicy: RemovalPolicy.DESTROY
});
let logDriver = new AwsLogDriver({
logRetention: RetentionDays.ONE_WEEK,
streamPrefix: "test-stream-prefix",
});
const vpc = new Vpc(this, 'cdk-my-vpc', {maxAzs: 2});
new cdk.CfnOutput(this, "MyVpc", {value: vpc.vpcId});
const cluster = new Cluster(this, "MyCluster", {
vpc: vpc,
clusterName: appId
});
const appImage = ContainerImage.fromEcrRepository(props.dependencies.appRepo, 'latest');
const applicationLoadBalancedFargateService = new ApplicationLoadBalancedFargateService(this, "FargateService", {
cluster: cluster,
taskImageOptions: {
image: appImage,
containerPort: 8080,
logDriver: logDriver
},
});
table.grantReadWriteData(applicationLoadBalancedFargateService.taskDefinition.taskRole);
}
}
Политика ролей задачи после cdk synth:
"FargateServiceTaskDefTaskRoleDefaultPolicy63F83D6F": {
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyDocument": {
"Statement": [
{
"Action": [
"dynamodb:BatchGetItem",
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:Query",
"dynamodb:GetItem",
"dynamodb:Scan",
"dynamodb:BatchWriteItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem"
],
"Effect": "Allow",
"Resource": [
{
"Fn::GetAtt": [
"MyDynamoDbTableC81ED735",
"Arn"
]
},
{
"Ref": "AWS::NoValue"
}
]
}
],
"Version": "2012-10-17"
},
"PolicyName": "FargateServiceTaskDefTaskRoleDefaultPolicy63F83D6F",
"Roles": [
{
"Ref": "FargateServiceTaskDefTaskRole8CDCF85E"
}
]
}