add: iam construct
This commit is contained in:
parent
2b2d8f3a87
commit
284ed0c1b7
5 changed files with 82 additions and 69 deletions
|
|
@ -2,7 +2,7 @@ import * as cdk from 'aws-cdk-lib';
|
||||||
import { Construct } from 'constructs';
|
import { Construct } from 'constructs';
|
||||||
import * as ecs from 'aws-cdk-lib/aws-ecs'
|
import * as ecs from 'aws-cdk-lib/aws-ecs'
|
||||||
|
|
||||||
import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds } from './construct';
|
import { Network, EcrRepository, FrontEndCluster, BackEndCluster, Rds, EcsIAM } from './construct';
|
||||||
// import * as sqs from 'aws-cdk-lib/aws-sqs';
|
// import * as sqs from 'aws-cdk-lib/aws-sqs';
|
||||||
|
|
||||||
export class LangflowAppStack extends cdk.Stack {
|
export class LangflowAppStack extends cdk.Stack {
|
||||||
|
|
@ -12,7 +12,11 @@ export class LangflowAppStack extends cdk.Stack {
|
||||||
const arch = ecs.CpuArchitecture.X86_64
|
const arch = ecs.CpuArchitecture.X86_64
|
||||||
|
|
||||||
// VPC
|
// VPC
|
||||||
const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendTaskRole, TaskExecutionRole, frontendTaskRole, backendLogGroup, frontendLogGroup} = new Network(this, 'Network')
|
const { vpc, cluster, alb, targetGroup, cloudmapNamespace, ecsFrontSG, ecsBackSG, dbSG, albSG, backendLogGroup, frontendLogGroup} = new Network(this, 'Network')
|
||||||
|
|
||||||
|
// IAM
|
||||||
|
const { backendTaskRole, TaskExecutionRole, frontendTaskRole } = new EcsIAM(this, 'EcsIAM')
|
||||||
|
|
||||||
// ECR
|
// ECR
|
||||||
const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', {
|
const { ecrFrontEndRepository,ecrBackEndRepository} = new EcrRepository(this, 'Ecr', {
|
||||||
cloudmapNamespace:cloudmapNamespace,
|
cloudmapNamespace:cloudmapNamespace,
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,7 @@ export class BackEndCluster extends Construct {
|
||||||
vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
|
vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Secrets ManagerからのSecret取得ロール
|
||||||
const ecsBackEndExecutionRole = iam.Role.fromRoleArn(
|
const ecsBackEndExecutionRole = iam.Role.fromRoleArn(
|
||||||
this,
|
this,
|
||||||
"ecsBackEndExecutionRole",
|
"ecsBackEndExecutionRole",
|
||||||
|
|
|
||||||
74
deploy/scripts/cdk/lib/construct/iam.ts
Normal file
74
deploy/scripts/cdk/lib/construct/iam.ts
Normal file
|
|
@ -0,0 +1,74 @@
|
||||||
|
import { RemovalPolicy, Duration } from 'aws-cdk-lib'
|
||||||
|
import { Construct } from 'constructs'
|
||||||
|
import {
|
||||||
|
aws_ec2 as ec2,
|
||||||
|
aws_ecs as ecs,
|
||||||
|
aws_iam as iam,
|
||||||
|
aws_logs as logs,
|
||||||
|
} from 'aws-cdk-lib';
|
||||||
|
|
||||||
|
export class EcsIAM extends Construct {
|
||||||
|
readonly backendTaskRole: iam.Role;
|
||||||
|
readonly TaskExecutionRole: iam.Role;
|
||||||
|
readonly frontendTaskRole: iam.Role;
|
||||||
|
|
||||||
|
constructor(scope: Construct, id: string) {
|
||||||
|
super(scope, id)
|
||||||
|
|
||||||
|
// Policy Statements
|
||||||
|
// ECS Policy State
|
||||||
|
const ECSExecPolicyStatement = new iam.PolicyStatement({
|
||||||
|
sid: 'allowECSExec',
|
||||||
|
resources: ['*'],
|
||||||
|
actions: [
|
||||||
|
'ecr:GetAuthorizationToken',
|
||||||
|
'ecr:BatchCheckLayerAvailability',
|
||||||
|
'ecr:GetDownloadUrlForLayer',
|
||||||
|
'ecr:BatchGetImage',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
// Bedrock Policy State
|
||||||
|
const BedrockPolicyStatement = new iam.PolicyStatement({
|
||||||
|
sid: 'allowBedrockAccess',
|
||||||
|
resources: ['*'],
|
||||||
|
actions: [
|
||||||
|
'bedrock:*',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
// Kendra Policy State
|
||||||
|
const KendraPolicyStatement = new iam.PolicyStatement({
|
||||||
|
sid: 'allowKendraAccess',
|
||||||
|
resources: ['*'],
|
||||||
|
actions: [
|
||||||
|
'kendra:*'
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
// FrontEnd Task Role
|
||||||
|
this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', {
|
||||||
|
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
|
||||||
|
});
|
||||||
|
this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement);
|
||||||
|
|
||||||
|
// BackEnd Task Role
|
||||||
|
this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', {
|
||||||
|
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
|
||||||
|
});
|
||||||
|
// ECS Exec Policyの付与
|
||||||
|
this.backendTaskRole.addToPolicy(ECSExecPolicyStatement);
|
||||||
|
// KendraとBedrockのアクセス権付与
|
||||||
|
this.backendTaskRole.addToPolicy(KendraPolicyStatement);
|
||||||
|
this.backendTaskRole.addToPolicy(BedrockPolicyStatement);
|
||||||
|
|
||||||
|
// Task ExecutionRole -> ここは共通
|
||||||
|
this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', {
|
||||||
|
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
|
||||||
|
managedPolicies: [
|
||||||
|
{
|
||||||
|
managedPolicyArn:
|
||||||
|
'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
export * from './db';
|
export * from './db';
|
||||||
export * from './ecr';
|
export * from './ecr';
|
||||||
|
export * from './iam';
|
||||||
export * from './frontend';
|
export * from './frontend';
|
||||||
export * from './backend';
|
export * from './backend';
|
||||||
export * from './network';
|
export * from './network';
|
||||||
|
|
@ -3,8 +3,6 @@ import { Construct } from 'constructs'
|
||||||
import {
|
import {
|
||||||
aws_ec2 as ec2,
|
aws_ec2 as ec2,
|
||||||
aws_ecs as ecs,
|
aws_ecs as ecs,
|
||||||
aws_dynamodb as dynamodb,
|
|
||||||
aws_iam as iam,
|
|
||||||
aws_logs as logs,
|
aws_logs as logs,
|
||||||
aws_servicediscovery as servicediscovery,
|
aws_servicediscovery as servicediscovery,
|
||||||
aws_elasticloadbalancingv2 as elb,
|
aws_elasticloadbalancingv2 as elb,
|
||||||
|
|
@ -20,9 +18,6 @@ export class Network extends Construct {
|
||||||
readonly ecsBackSG: ec2.SecurityGroup;
|
readonly ecsBackSG: ec2.SecurityGroup;
|
||||||
readonly dbSG: ec2.SecurityGroup;
|
readonly dbSG: ec2.SecurityGroup;
|
||||||
readonly albSG: ec2.SecurityGroup;
|
readonly albSG: ec2.SecurityGroup;
|
||||||
readonly backendTaskRole: iam.Role;
|
|
||||||
readonly TaskExecutionRole: iam.Role;
|
|
||||||
readonly frontendTaskRole: iam.Role;
|
|
||||||
readonly backendLogGroup: logs.LogGroup;
|
readonly backendLogGroup: logs.LogGroup;
|
||||||
readonly frontendLogGroup: logs.LogGroup;
|
readonly frontendLogGroup: logs.LogGroup;
|
||||||
|
|
||||||
|
|
@ -130,68 +125,6 @@ export class Network extends Construct {
|
||||||
// AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可
|
// AppRunnerSecurityGroupからのポート3306:mysql(5432:postgres)のインバウンドを許可
|
||||||
this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306))
|
this.dbSG.addIngressRule(this.ecsBackSG, ec2.Port.tcp(3306))
|
||||||
|
|
||||||
// ECS Policy State
|
|
||||||
const ECSExecPolicyStatement = new iam.PolicyStatement({
|
|
||||||
sid: 'allowECSExec',
|
|
||||||
resources: ['*'],
|
|
||||||
actions: [
|
|
||||||
'ecr:GetAuthorizationToken',
|
|
||||||
'ecr:BatchCheckLayerAvailability',
|
|
||||||
'ecr:GetDownloadUrlForLayer',
|
|
||||||
'ecr:BatchGetImage',
|
|
||||||
'ssmmessages:CreateControlChannel',
|
|
||||||
'ssmmessages:CreateDataChannel',
|
|
||||||
'ssmmessages:OpenControlChannel',
|
|
||||||
'ssmmessages:OpenDataChannel',
|
|
||||||
'logs:CreateLogStream',
|
|
||||||
'logs:DescribeLogGroups',
|
|
||||||
'logs:DescribeLogStreams',
|
|
||||||
'logs:PutLogEvents',
|
|
||||||
],
|
|
||||||
});
|
|
||||||
// Bedrock roll
|
|
||||||
const BedrockPolicyStatement = new iam.PolicyStatement({
|
|
||||||
sid: 'allowBedrockAccess',
|
|
||||||
resources: ['*'],
|
|
||||||
actions: [
|
|
||||||
'bedrock:*',
|
|
||||||
],
|
|
||||||
});
|
|
||||||
// Kendra roll
|
|
||||||
const KendraPolicyStatement = new iam.PolicyStatement({
|
|
||||||
sid: 'allowKendraAccess',
|
|
||||||
resources: ['*'],
|
|
||||||
actions: [
|
|
||||||
'kendra:*'
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
this.backendTaskRole = new iam.Role(this, 'BackendTaskRole', {
|
|
||||||
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
|
|
||||||
});
|
|
||||||
// ECS Exec Policyの付与
|
|
||||||
this.backendTaskRole.addToPolicy(ECSExecPolicyStatement);
|
|
||||||
// KendraとBedrockのアクセス権付与
|
|
||||||
this.backendTaskRole.addToPolicy(KendraPolicyStatement);
|
|
||||||
this.backendTaskRole.addToPolicy(BedrockPolicyStatement);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.frontendTaskRole = new iam.Role(this, 'FrontendTaskRole', {
|
|
||||||
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
|
|
||||||
});
|
|
||||||
this.frontendTaskRole.addToPolicy(ECSExecPolicyStatement);
|
|
||||||
|
|
||||||
this.TaskExecutionRole = new iam.Role(this, 'TaskExecutionRole', {
|
|
||||||
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
|
|
||||||
managedPolicies: [
|
|
||||||
{
|
|
||||||
managedPolicyArn:
|
|
||||||
'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
// Create CloudWatch Log Group
|
// Create CloudWatch Log Group
|
||||||
this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', {
|
this.backendLogGroup = new logs.LogGroup(this, 'backendLogGroup', {
|
||||||
logGroupName: 'myapp-backend',
|
logGroupName: 'myapp-backend',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue