К основному содержанию
правило

aws — правило для Cursor: стандарты AWS CDK v2 и serverless

Задаёт агенту стандарты разработки на AWS: только CDK v2, переиспользование окружения Lambda, идемпотентность и минимальные права IAM.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/aws.mdc
Открыть на GitHub

Что делает aws

Правило подключается к Cursor через файл .cursor/rules/aws.mdc и действует на все файлы проекта. Внутри — набор требований по инфраструктуре как коду и serverless-паттернам, построенный вокруг AWS Well-Architected Framework.

Главное требование — CDK v2. CDK v1 считается устаревшим, поэтому все новые проекты и миграции агент будет вести на второй версии. Ресурсы предлагается упаковывать в переиспользуемые Constructs, а приложение делить на логические стеки вроде DataStack и ApiStack с явной передачей зависимостей между ними.

Отдельный блок — типичные ошибки. SDK-клиенты и подключения к базе нужно создавать вне обработчика Lambda, а не внутри него. Секреты и настройки окружения не хардкодятся, а берутся из переменных окружения или Parameter Store. Для защиты от повторных вызовов правило советует Powertools for Lambda, для контроля прав — cdk-nag. Если у вас уже есть рабочий проект на CDK v1, это повод проверить, сколько кода придётся переписать перед обновлением.

Какие задачи решает

  • перевести инфраструктуру с CDK v1 на CDK v2
  • разложить ресурсы по переиспользуемым Constructs
  • вынести инициализацию SDK-клиента за пределы обработчика Lambda
  • сделать функцию Lambda идемпотентной при повторных вызовах
  • подобрать размер памяти для ресурсоёмкой функции

Примеры запросов агенту

  • Разбей этот стек на DataStack и ApiStack и передай зависимости явно
  • Проверь мой обработчик Lambda: клиент DynamoDB создаётся внутри функции, исправь
  • Добавь идемпотентность в эту Lambda через Powertools

Как установить aws

Вручную: положить файлы

.cursor/rules/aws.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Из того же набора69

chakra-ui Правило для Cursor задаёт, как писать интерфейсы на Chakra UI v2: тема через токены, варианты компонентов через рецепты, стилевые пропсы вместо CSS. ★ 3 579звёзд репо bottle Правило для Cursor задаёт структуру Bottle-проекта: модули вместо одного app.py, конфиг через app.config, валидация Pydantic. Пригодится, если пишете бэкенд на Bottle. ★ 3 579звёзд репо behave Правило задаёт Cursor стандарты для BDD-тестов на behave: тонкие шаги, чистый Gherkin, фикстуры через environment.py. ★ 3 579звёзд репо azure Правило для Cursor с набором требований к коду и инфраструктуре в Azure: IaC, безопасность, экономия ресурсов. Пригодится, если проект живёт в Azure. ★ 3 579звёзд репо aws-ecs Правило для Cursor с набором требований к контейнерам на AWS ECS: неизменяемые образы, секреты из Secrets Manager, логи в stdout. Пригодится, когда агент пишет Dockerfile и task definition. ★ 3 579звёзд репо aws-amplify Правило задаёт Cursor стиль работы с AWS Amplify Gen 2: отдельные файлы ресурсов, модульные функции, типизированные запросы к данным. Пригодится, если бэкенд на Amplify растёт и хочется держать его в порядке. ★ 3 579звёзд репо asyncio Правило для Cursor задаёт, как писать асинхронный код на Python: единая точка входа, задачи без утечек, никаких блокировок цикла событий. ★ 3 579звёзд репо apollo-graphql Правило для Cursor задаёт порядок работы с Apollo GraphQL: сначала схема на SDL, потом резолверы. Пригодится, если в проекте JS или JSX. ★ 3 579звёзд репо

Похожие

aws-development Mindrally Скилл задаёт агенту правила разработки на AWS: Lambda, CDK, SAM, DynamoDB, IAM и serverless-архитектура через Infrastructure as Code. CX Codex +1 701установок aws-serverless-architect официальный github Помогает проектировать бессерверные системы в AWS на базе Lambda, DynamoDB и API Gateway. Понадобится при подготовке IaC-шаблонов и схем взаимодействия сервисов. ★ 40 418звёзд репо aws-blocks aws Скилл ведёт агента по AWS Blocks: выбор Building Blocks, локальная разработка и деплой. Пригодится, когда бэкенд живёт в каталоге aws-blocks/. CX Codex +1 5 500установок connecting-lambda-to-dynamodb aws Помогает связать функцию AWS Lambda с таблицей DynamoDB. Настраивает роли IAM, потоки DynamoDB Streams и триггеры обработки событий. CX Codex +1 6 500установок aws-lambda-python-integration giuseppe-trisciuoglio Подсказывает агенту, как писать и разворачивать Python-функции в AWS Lambda: Chalice или чистый Python, холодный старт, API Gateway и ALB. CX Codex +1 3 600установок aws-solution-architect Alireza Rezvani Проектирует архитектуру AWS, генерирует шаблоны IaC и разбирает расходы. Пригодится при запуске серверлес-приложения, миграции или настройке CI/CD. 1 586установок

Рядом в теме «Облака: AWS, Azure, GCP»

Все правила IDE по теме «Облака: AWS, Azure, GCP» →

Вопросы о aws

Как установить правило aws в Cursor?

Положите файл по пути .cursor/rules/aws.mdc в корне проекта. Cursor подхватит его автоматически, потому что в правиле задан glob **/*.

Что делает правило aws?

Оно задаёт агенту стандарты разработки на AWS: CDK v2 вместо v1, модульные Constructs, логические стеки, переиспользование окружения Lambda и минимальные права IAM.

Какие инструменты нужны для работы с этим правилом?

Правило опирается на AWS CDK v2 и AWS Well-Architected Framework. Для идемпотентности Lambda упоминается Powertools for Lambda, для проверки IAM-политик — cdk-nag.

Исходный текст

aws.mdc · CC0-1.0
---
description: This guide provides opinionated, actionable best practices for developing and deploying applications on AWS, emphasizing CDK v2, serverless patterns, and Well-Architected principles.
globs: **/*
---
# AWS Best Practices

This document outlines our definitive AWS development standards, rooted in the AWS Well-Architected Framework and modern DevOps guidance. We mandate CDK v2 for infrastructure-as-code and prioritize serverless patterns. Adhere to these guidelines to build secure, reliable, performant, and cost-optimized AWS applications.

## 1. Code Organization and Structure (AWS CDK v2)

Always structure your AWS CDK applications for clarity, reusability, and maintainability.

### 1.1 Use AWS CDK v2 Exclusively

CDK v1 is deprecated. All new development and migrations **must** use CDK v2.

❌ **BAD: Using CDK v1**
```typescript
// cdk.json
{
  "app": "npx ts-node bin/my-app.ts",
  "context": {
    "@aws-cdk/core:enableStackNameDuplicates": "true",
    // ... other v1 context
  }
}
```

✅ **GOOD: Using CDK v2**
```typescript
// cdk.json
{
  "app": "npx ts-node --prefer-ts-exts bin/my-app.ts",
  "context": {
    "@aws-cdk/aws-ecr:disableCrossAccountPush": true,
    "@aws-cdk/aws-iam:minimizePolicies": true,
    "@aws-cdk/core:stackRelativeExports": true,
    "@aws-cdk/aws-lambda:recognizeVersionProps": true,
    // ... other v2 context
  }
}
```

### 1.2 Modularize with Constructs

Encapsulate related resources, runtime code, and configuration into reusable CDK Constructs. This promotes componentization and reduces boilerplate.

```typescript
// lib/api-construct.ts
import { Construct } from 'aws-cdk-lib';
import { RestApi, LambdaIntegration } from 'aws-cdk-lib/aws-apigateway';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import { Runtime } from 'aws-cdk-lib/aws-lambda';
import { Table } from 'aws-cdk-lib/aws-dynamodb';

interface ApiConstructProps {
  tableName: string;
  table: Table;
}

export class ApiConstruct extends Construct {
  constructor(scope: Construct, id: string, props: ApiConstructProps) {
    super(scope, id);

    const handler = new NodejsFunction(this, 'MyApiHandler', {
      runtime: Runtime.NODEJS_20_X,
      entry: 'src/lambda/api-handler.ts',
      environment: {
        TABLE_NAME: props.tableName,
      },
    });

    props.table.grantReadWriteData(handler);

    const api = new RestApi(this, 'MyApi', {
      restApiName: 'MyServiceApi',
    });

    api.root.addMethod('GET', new LambdaIntegration(handler));
  }
}
```

### 1.3 Design Logical Stacks

Organize your application into logical stacks (e.g., `DataStack`, `ApiStack`, `MonitoringStack`). Each stack should represent a deployable unit.

```typescript
// bin/my-app.ts
import 'source-map-support/register';
import { App } from 'aws-cdk-lib';
import { DataStack } from '../lib/data-stack';
import { ApiStack } from '../lib/api-stack';

const app = new App();

const dataStack = new DataStack(app, 'MyServiceDataStack', {
  env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },
});

new ApiStack(app, 'MyServiceApiStack', {
  table: dataStack.table, // Pass dependencies explicitly
  env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },
});

app.synth();
```

## 2. Common Patterns and Anti-patterns

Adopt proven patterns and rigorously avoid anti-patterns.

### 2.1 Lambda Execution Environment Reuse

Initialize SDK clients and reusable resources (e.g., database connections) outside the Lambda handler. This significantly improves performance and reduces cost.

❌ **BAD: Initializing resources inside the handler**
```typescript
// src/lambda/api-handler.ts
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';

export const handler = async (event: any) => {
  const client = new DynamoDBClient({}); // New client on every invocation
  // ... use client
  return { statusCode: 200, body: 'OK' };
};
```

✅ **GOOD: Initializing resources outside the handler**
```typescript
// src/lambda/api-handler.ts
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({}); // Initialized once per execution environment

export const handler = async (event: any) => {
  // ... use client
  return { statusCode: 200, body: 'OK' };
};
```

### 2.2 Use Environment Variables for Configuration

Never hardcode secrets or environment-specific configurations. Use Lambda environment variables or AWS Systems Manager Parameter Store.

❌ **BAD: Hardcoding bucket name**
```typescript
const S3_BUCKET = 'my-hardcoded-bucket-name-prod'; // Don't do this!
```

✅ **GOOD: Using environment variables**
```typescript
// Lambda code
const S3_BUCKET = process.env.S3_BUCKET_NAME;

// CDK definition
new NodejsFunction(this, 'MyFunction', {
  // ...
  environment: {
    S3_BUCKET_NAME: 'my-dynamic-bucket-name', // Set via CDK
  },
});
```

### 2.3 Write Idempotent Lambda Functions

Design your Lambda functions to produce the same result even if invoked multiple times with the same input. This is critical for reliable distributed systems. Use AWS Powertools for Idempotency.

```typescript
// Example using Powertools for Lambda (TypeScript)
import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/lib/persistence';
import { idempotent } from '@aws-lambda-powertools/idempotency';

const persistenceLayer = new DynamoDBPersistenceLayer({
  tableName: process.env.IDEMPOTENCY_TABLE_NAME!,
});

export const handler = idempotent(
  async (event: any) => {
    // Your business logic here
    console.log('Processing event:', event.detail.id);
    // Simulate some work
    await new Promise(resolve => setTimeout(resolve, 100));
    return { status: 'processed', id: event.detail.id };
  },
  { persistenceStore: persistenceLayer }
);
```

## 3. Performance Considerations

Optimize your AWS resources for efficiency and cost.

### 3.1 Tune Lambda Memory and CPU

Memory allocation directly impacts CPU and network performance. Use CloudWatch metrics (`Max Memory Used`) and tools like AWS Lambda Power Tuning to find the optimal memory configuration.

❌ **BAD: Defaulting to 128MB for CPU-intensive tasks**
```typescript
new NodejsFunction(this, 'CpuIntensiveFunction', {
  runtime: Runtime.NODEJS_20_X,
  memorySize: 128, // Likely under-provisioned
  // ...
});
```

✅ **GOOD: Performance testing and tuning memory**
```typescript
new NodejsFunction(this, 'CpuIntensiveFunction', {
  runtime: Runtime.NODEJS_20_X,
  memorySize: 1024, // Tuned based on performance testing
  // ...
});
```

## 4. Common Pitfalls and Gotchas

Avoid these common mistakes that lead to security vulnerabilities, operational issues, or unexpected costs.

### 4.1 Enforce Least Privilege IAM

Grant only the necessary permissions to your AWS resources. Use `cdk-nag` to enforce this policy.

❌ **BAD: Over-permissive IAM policy**
```typescript
// Granting full S3 access when only read is needed
bucket.grantReadWrite(lambdaFunction); // Too broad!
```

✅ **GOOD: Least privilege IAM**
```typescript
// Granting specific S3 read access
bucket.grantRead(lambdaFunction); // Only read access
```

### 4.2 Avoid Recursive Lambda Invocations

A Lambda function should never directly or indirectly invoke itself or trigger a process that leads to its own re-invocation. This creates infinite loops and massive bills.

❌ **BAD: Recursive invocation pattern**
```typescript
// Inside a Lambda handler processing SQS messages
// If processing fails, put message back to the SAME queue
// This can lead to an infinite loop if the error persists
sqs.sendMessage({ MessageBody: JSON.stringify(event) });
```

✅ **GOOD: Use Dead-Letter Queues (DLQs) for failures**
```typescript
// CDK definition for Lambda with DLQ
import { SqsDlq } from 'aws-cdk-lib/aws-lambda-event-sources';
import { Queue } from 'aws-cdk-lib/aws-sqs';

const dlq = new Queue(this, 'MyFunctionDLQ');
const myFunction = new NodejsFunction(this, 'MyFunction', {
  // ...
  deadLetterQueue: dlq, // Failed invocations go here
  deadLetterQueueEnabled: true,
});
```

## 5. Testing Approaches

Implement robust testing for your AWS infrastructure and application code.

### 5.1 Mandate `cdk-nag` for Policy Enforcement

Use `cdk-nag` to automatically validate your CDK constructs against security and operational best practices (e.g., AWS Solutions Security Hub, NIST 800-53). Integrate it into your CI/CD pipeline.

```typescript
// bin/my-app.ts
import { App, Aspects } from 'aws-cdk-lib';
import { AwsSolutionsChecks, NagSuppressions } from 'cdk-nag';
import { MyServiceStack } from '../lib/my-service-stack';

const app = new App();
const stack = new MyServiceStack(app, 'MyServiceStack');

// Apply the AWS Solutions checks to the entire app
Aspects.of(app).add(new AwsSolutionsChecks({ verbose: true }));

// Suppress specific rules with justification if absolutely necessary
NagSuppressions.addStackSuppressions(stack, [
  { id: 'AwsSolutions-IAM4', reason: 'Managed policy for specific use case.' },
  { id: 'AwsSolutions-L1', reason: 'Lambda runtime is managed by AWS.' },
]);

app.synth();
```

### 5.2 Implement Unit and Integration Tests

Write unit tests for your Lambda functions and CDK constructs. Use integration tests for end-to-end validation of your deployed services.

```typescript
// test/my-api.test.ts (CDK Unit Test)
import { App, Stack } from 'aws-cdk-lib';
import { Template } from 'aws-cdk-lib/assertions';
import { ApiConstruct } from '../lib/api-construct';
import { Table } from 'aws-cdk-lib/aws-dynamodb';

test('ApiConstruct creates expected resources', () => {
  const app = new App();
  const stack = new Stack(app, 'TestStack');
  const table = new Table(stack, 'TestTable', { tableName: 'TestTable' });

  new ApiConstruct(stack, 'TestApi', { tableName: 'TestTable', table });

  const template = Template.fromStack(stack);

  template.hasResourceProperties('AWS::Lambda::Function', {
    Runtime: 'nodejs20.x',
    Environment: {
      Variables: {
        TABLE_NAME: 'TestTable',
      },
    },
  });

  template.hasResourceProperties('AWS::ApiGateway::RestApi', {
    Name: 'MyServiceApi',
  });
});
```

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой