Skip to content

Policy ​

The Policy resource allows you to manage AWS IAM Policies that define permissions for AWS resources. This enables fine-grained control over who can do what in your AWS account.

Minimal Example ​

Create a basic IAM policy attached to a user with necessary permissions.

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

const basicPolicy = await AWS.IAM.Policy("basicPolicy", {
  PolicyName: "BasicS3Access",
  PolicyDocument: {
    Version: "2012-10-17",
    Statement: [
      {
        Effect: "Allow",
        Action: ["s3:ListBucket", "s3:GetObject"],
        Resource: ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"]
      }
    ]
  },
  Users: ["myUser"]
});

Advanced Configuration ​

Configure an IAM policy for multiple groups and roles with more complex permissions.

ts
const advancedPolicy = await AWS.IAM.Policy("advancedPolicy", {
  PolicyName: "FullS3Access",
  PolicyDocument: {
    Version: "2012-10-17",
    Statement: [
      {
        Effect: "Allow",
        Action: "s3:*",
        Resource: "*"
      },
      {
        Effect: "Deny",
        Action: "s3:DeleteObject",
        Resource: ["arn:aws:s3:::my-bucket/*"],
        Condition: {
          StringEquals: {
            "s3:prefix": ["restricted/"]
          }
        }
      }
    ]
  },
  Groups: ["AdminGroup", "DevGroup"],
  Roles: ["S3FullAccessRole"]
});

Policy for Lambda Execution ​

Create a policy specifically for allowing AWS Lambda to access DynamoDB.

ts
const lambdaExecutionPolicy = await AWS.IAM.Policy("lambdaExecutionPolicy", {
  PolicyName: "LambdaDynamoDBAccess",
  PolicyDocument: {
    Version: "2012-10-17",
    Statement: [
      {
        Effect: "Allow",
        Action: [
          "dynamodb:GetItem",
          "dynamodb:PutItem",
          "dynamodb:UpdateItem"
        ],
        Resource: ["arn:aws:dynamodb:us-west-2:123456789012:table/MyTable"]
      }
    ]
  },
  Roles: ["MyLambdaExecutionRole"]
});

Policy for EC2 Instance ​

Define a policy that grants an EC2 instance access to specific S3 buckets.

ts
const ec2Policy = await AWS.IAM.Policy("ec2Policy", {
  PolicyName: "EC2S3Access",
  PolicyDocument: {
    Version: "2012-10-17",
    Statement: [
      {
        Effect: "Allow",
        Action: ["s3:ListBucket"],
        Resource: ["arn:aws:s3:::my-bucket"]
      },
      {
        Effect: "Allow",
        Action: ["s3:GetObject", "s3:PutObject"],
        Resource: ["arn:aws:s3:::my-bucket/*"]
      }
    ]
  },
  Roles: ["MyEC2InstanceRole"]
});