in src/main/java/com/awsblog/queueing/cdk/RoleStack.java [52:116]
public RoleStack(final Construct parent, final String id,
Configuration config, final StackProps props, Map<String, IRole> roles) {
super(parent, id, props);
PolicyDocument pd = new PolicyDocument();
for(ConfigTable tbl : config.getTables()) {
// create a DynamoDB IAM policy statement
PolicyStatement ps = new PolicyStatement();
ps.addActions("dynamodb:GetItem", "dynamodb:BatchGetItem",
"dynamodb:PutItem", "dynamodb:UpdateItem",
"dynamodb:BatchWriteItem", "dynamodb:GetRecords", "dynamodb:DeleteItem",
"dynamodb:Query", "dynamodb:DescribeTable", "dynamodb:Scan", "dynamodb:TagResource");
ps.addResources("arn:aws:dynamodb:*:*:table/" + tbl.getTableName(),
"arn:aws:dynamodb:*:*:table/" + tbl.getTableName() + "/index/*");
pd.addStatements(ps);
}
// CloudWatchLogs
PolicyStatement logs_ps = new PolicyStatement();
logs_ps.addActions("logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams");
logs_ps.addAllResources();
pd.addStatements(logs_ps);
// ec2 permissions
PolicyStatement ec2_ps = new PolicyStatement();
ec2_ps.addActions("ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface",
"ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcs");
ec2_ps.addAllResources();
pd.addStatements(ec2_ps);
// SNS policy
PolicyStatement sns_ps = new PolicyStatement();
sns_ps.addActions("sns:List*", "sns:Publish");
sns_ps.addAllResources();
pd.addStatements(sns_ps);
// CloudWatchLogs
PolicyStatement cw_ps = new PolicyStatement();
cw_ps.addActions("cloudwatch:*");
cw_ps.addAllResources();
pd.addStatements(cw_ps);
// Lambda execution
PolicyStatement lambda_exec_ps = new PolicyStatement();
lambda_exec_ps.addActions("lambda:InvokeFunction");
lambda_exec_ps.addAllResources();
Map<String, PolicyDocument> map = new HashMap<>();
map.put("aws-blog-queue.lambda.policy_document", pd);
ServicePrincipalOpts.Builder spob = new ServicePrincipalOpts.Builder();
Builder b = new Builder()
.roleName("aws-blog-queue.lambda.role")
.assumedBy(new ServicePrincipal("lambda.amazonaws.com", spob.build()))
.inlinePolicies(map);
IRole role = new Role(this, "aws-blog-queue.Role", b.build());
roles.put("lambda-role", role);
}