Skip to content

Role ​

The Role resource allows you to create and manage AWS IAM Roles which define a set of permissions for making AWS service requests. IAM roles can be assumed by AWS services, users, or applications.

Minimal Example ​

Create a basic IAM Role with a trust policy that allows EC2 instances to assume it.

ts
import AWS from "alchemy/aws/control";

const ec2Role = await AWS.IAM.Role("ec2Role", {
  AssumeRolePolicyDocument: {
    Version: "2012-10-17",
    Statement: [{
      Effect: "Allow",
      Principal: {
        Service: "ec2.amazonaws.com"
      },
      Action: "sts:AssumeRole"
    }]
  },
  RoleName: "EC2InstanceRole",
  Description: "Role for EC2 instances to access S3 and DynamoDB",
  ManagedPolicyArns: [
    "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess",
    "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess"
  ]
});

Advanced Configuration ​

Define an IAM Role with a custom permissions boundary and session duration.

ts
const advancedRole = await AWS.IAM.Role("advancedRole", {
  AssumeRolePolicyDocument: {
    Version: "2012-10-17",
    Statement: [{
      Effect: "Allow",
      Principal: {
        Service: "lambda.amazonaws.com"
      },
      Action: "sts:AssumeRole"
    }]
  },
  RoleName: "AdvancedLambdaRole",
  Description: "Role for Lambda functions with custom permissions",
  PermissionsBoundary: "arn:aws:iam::123456789012:policy/CustomPermissionsBoundary",
  MaxSessionDuration: 3600, // 1 hour
  Tags: [{
    Key: "Environment",
    Value: "Production"
  }]
});

Role with Inline Policies ​

Create a role that includes inline policies for fine-grained access control.

ts
const inlinePolicyRole = await AWS.IAM.Role("inlinePolicyRole", {
  AssumeRolePolicyDocument: {
    Version: "2012-10-17",
    Statement: [{
      Effect: "Allow",
      Principal: {
        Service: "ecs-tasks.amazonaws.com"
      },
      Action: "sts:AssumeRole"
    }]
  },
  RoleName: "EcsTaskRole",
  Description: "Role for ECS tasks with inline policies",
  Policies: [{
    PolicyName: "EcsTaskPolicy",
    PolicyDocument: {
      Version: "2012-10-17",
      Statement: [{
        Effect: "Allow",
        Action: [
          "s3:GetObject",
          "dynamodb:Query"
        ],
        Resource: [
          "arn:aws:s3:::my-bucket/*",
          "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable"
        ]
      }]
    }
  }]
});