Use Cases

Claude Code × AWS ECS/Fargate संपूर्ण गाइड | कंटेनर डिप्लॉयमेंट को स्वचालित करें

Claude Code से AWS ECS/Fargate डिप्लॉयमेंट को स्वचालित करें। टास्क डेफिनिशन, सर्विस कॉन्फिगरेशन, Blue/Green डिप्लॉयमेंट और CDK इन्फ्रास्ट्रक्चर तक — Masa के वास्तविक अनुभव पर आधारित।

“मैं AWS पर कंटेनर चलाना चाहता हूं, लेकिन ECS कॉन्फिगरेशन बहुत जटिल है” — यह वह दीवार है जिससे कई डेवलपर्स पहले टकराते हैं। टास्क डेफिनिशन, सर्विस, क्लस्टर, लोड बैलेंसर, ऑटो स्केलिंग… इतनी सेटिंग्स हैं कि समझ नहीं आता कहां से शुरू करें।

मैं काम पर ECS/Fargate के साथ सर्वरलेस कंटेनर एनवायरनमेंट बना रहा हूं, और जब से मैंने Claude Code का उपयोग अपनी आर्किटेक्चर बताने के लिए करना शुरू किया और इससे टास्क डेफिनिशन से लेकर CDK कोड तक सब कुछ जेनरेट करवाना शुरू किया, डिप्लॉयमेंट बहुत आसान हो गई है। यह लेख व्यावहारिक चरणों को बताता है।


3 मिनट में ECS/Fargate की मूल बातें

Cluster:          ECS कंटेनर चलाने की "बॉक्स"
Task Definition:  कंटेनर स्पेसिफिकेशन (इमेज, CPU, मेमोरी, एनवायरनमेंट वेरिएबल्स)
Service:          कितने टास्क चलाने हैं (ऑटो स्केलिंग सहित)
Fargate:          सर्वरलेस कंटेनर एक्जीक्यूशन इंजन — कोई सर्वर मैनेजमेंट नहीं

EC2 के विपरीत, Fargate में सर्वर प्रोविजनिंग या पैच मैनेजमेंट की जरूरत नहीं। आप पूरी तरह कंटेनर कॉन्फिगरेशन पर ध्यान दे सकते हैं।


Step 1: टास्क डेफिनिशन को स्वचालित रूप से जेनरेट करें

claude -p "
निम्नलिखित आवश्यकताओं के साथ ECS टास्क डेफिनिशन JSON में जेनरेट करें:

- App: Node.js API (पोर्ट 3000)
- CPU: 512 (0.5 vCPU)
- Memory: 1024 MB
- Environment variables: DATABASE_URL (Secrets Manager से प्राप्त), NODE_ENV=production
- Logging: CloudWatch Logs (log group /ecs/myapp)
- Health check: /health endpoint, 30 सेकंड इंटरवल
- Container image: 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest
- Execution role: ecsTaskExecutionRole
- Task role: myapp-task-role (DynamoDB और S3 तक पहुंच)
"

जेनरेट की गई टास्क डेफिनिशन:

{
  "family": "myapp-task",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "512",
  "memory": "1024",
  "executionRoleArn": "arn:aws:iam::123456789:role/ecsTaskExecutionRole",
  "taskRoleArn": "arn:aws:iam::123456789:role/myapp-task-role",
  "containerDefinitions": [
    {
      "name": "myapp",
      "image": "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest",
      "portMappings": [{ "containerPort": 3000, "protocol": "tcp" }],
      "environment": [{ "name": "NODE_ENV", "value": "production" }],
      "secrets": [
        {
          "name": "DATABASE_URL",
          "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789:secret:prod/database-url"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/myapp",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "healthCheck": {
        "command": ["CMD-SHELL", "curl -f http://localhost:3000/health || exit 1"],
        "interval": 30,
        "timeout": 5,
        "retries": 3,
        "startPeriod": 60
      }
    }
  ]
}

Step 2: CDK से ECS/Fargate इन्फ्रास्ट्रक्चर बनाएं

सिर्फ टास्क डेफिनिशन नहीं, बल्कि क्लस्टर, सर्विस और ALB सभी को एक साथ CDK से जेनरेट करते हैं।

claude -p "
lib/ecs-stack.ts में निम्नलिखित ECS/Fargate environment को CDK TypeScript में implement करें:

- VPC: मौजूदा VPC import करें (vpcId environment variable से)
- ECS Cluster: केवल Fargate
- Task Definition: ऊपर जेनरेट की गई स्पेसिफिकेशन के अनुसार
- ALB: HTTPS (ACM certificate ARN environment variable से), HTTP 301 से redirect
- Service: minimum 2, maximum 10 tasks के साथ auto scaling
  - 70% CPU utilization पर scale out
  - Target tracking scaling
- Blue/Green deploy सपोर्ट (CodeDeploy integration)
- CloudWatch dashboard में service status दिखाएं
"
// lib/ecs-stack.ts
import * as cdk from "aws-cdk-lib";
import * as ec2 from "aws-cdk-lib/aws-ec2";
import * as ecs from "aws-cdk-lib/aws-ecs";
import * as ecsp from "aws-cdk-lib/aws-ecs-patterns";
import * as acm from "aws-cdk-lib/aws-certificatemanager";

export class EcsStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // मौजूदा VPC import करें
    const vpc = ec2.Vpc.fromLookup(this, "Vpc", {
      vpcId: process.env.VPC_ID!,
    });

    // ECS Cluster
    const cluster = new ecs.Cluster(this, "Cluster", {
      vpc,
      clusterName: "myapp-cluster",
      containerInsights: true,  // CloudWatch Container Insights सक्षम करें
    });

    // ACM Certificate
    const certificate = acm.Certificate.fromCertificateArn(
      this, "Certificate",
      process.env.CERTIFICATE_ARN!
    );

    // Task Definition
    const taskDef = new ecs.FargateTaskDefinition(this, "TaskDef", {
      cpu: 512,
      memoryLimitMiB: 1024,
    });

    const container = taskDef.addContainer("app", {
      image: ecs.ContainerImage.fromEcrRepository(
        ecr.Repository.fromRepositoryName(this, "Repo", "myapp")
      ),
      environment: { NODE_ENV: "production" },
      logging: ecs.LogDrivers.awsLogs({ streamPrefix: "ecs" }),
      healthCheck: {
        command: ["CMD-SHELL", "curl -f http://localhost:3000/health || exit 1"],
        interval: cdk.Duration.seconds(30),
        timeout: cdk.Duration.seconds(5),
        retries: 3,
        startPeriod: cdk.Duration.seconds(60),
      },
    });
    container.addPortMappings({ containerPort: 3000 });

    // ALB + Fargate Service (patterns से संक्षिप्त)
    const service = new ecsp.ApplicationLoadBalancedFargateService(
      this, "Service", {
        cluster,
        taskDefinition: taskDef,
        desiredCount: 2,
        certificate,
        redirectHTTP: true,
        publicLoadBalancer: true,
      }
    );

    // Auto Scaling कॉन्फिगरेशन
    const scaling = service.service.autoScaleTaskCount({
      minCapacity: 2,
      maxCapacity: 10,
    });
    scaling.scaleOnCpuUtilization("CpuScaling", {
      targetUtilizationPercent: 70,
      scaleInCooldown: cdk.Duration.seconds(60),
      scaleOutCooldown: cdk.Duration.seconds(60),
    });

    // Output
    new cdk.CfnOutput(this, "LoadBalancerDns", {
      value: service.loadBalancer.loadBalancerDnsName,
    });
  }
}

Step 3: GitHub Actions से CI/CD Pipeline बनाएं

claude -p "
GitHub Actions से निम्नलिखित CI/CD pipeline बनाएं:

1. main branch पर push होने पर trigger
2. Docker image build करके ECR में push
3. ECS task definition में image tag को नए SHA से अपडेट करें
4. ECS service में नई task definition deploy करें
5. Deployment पूरा होने पर Slack को notify करें

Environment: ap-northeast-1, ECR repository name: myapp
"
name: Deploy to ECS

on:
  push:
    branches: [main]

env:
  AWS_REGION: ap-northeast-1
  ECR_REPOSITORY: myapp
  ECS_CLUSTER: myapp-cluster
  ECS_SERVICE: myapp-service
  CONTAINER_NAME: app

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v2

      - name: Build, tag, and push image to ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

      - name: Download task definition
        run: |
          aws ecs describe-task-definition --task-definition myapp-task \
            --query taskDefinition > task-definition.json

      - name: Update ECS task definition with new image
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@v1
        with:
          task-definition: task-definition.json
          container-name: ${{ env.CONTAINER_NAME }}
          image: ${{ steps.build-image.outputs.image }}

      - name: Deploy to ECS
        uses: aws-actions/amazon-ecs-deploy-task-definition@v1
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

      - name: Notify Slack on success
        if: success()
        uses: slackapi/slack-github-action@v1
        with:
          webhook: ${{ secrets.SLACK_WEBHOOK }}
          payload: |
            {"text": "✅ Deployed to ECS: ${{ github.sha }}"}

Step 4: Blue/Green Deployment कॉन्फिगर करें

claude -p "
ECS service के लिए Blue/Green deployment (CodeDeploy) सेट करने के लिए
CDK code और AppSpec file जेनरेट करें।
Rollback condition: deployment के 5 मिनट के भीतर CloudWatch alarm fire होने पर automatic rollback
"
# appspec.yaml (CodeDeploy के लिए)
version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: <TASK_DEFINITION>
        LoadBalancerInfo:
          ContainerName: app
          ContainerPort: 3000
        PlatformVersion: LATEST
Hooks:
  - BeforeAllowTraffic: "arn:aws:lambda:ap-northeast-1:123456789:function:health-check"
  - AfterAllowTraffic: "arn:aws:lambda:ap-northeast-1:123456789:function:smoke-test"

5 सबसे बड़ी गलतियां

1. Health check में startPeriod भूल जाना

Fargate कंटेनर शुरू होते ही health check करता है, लेकिन अगर एप्लिकेशन धीरे-धीरे शुरू होती है तो वह तुरंत UNHEALTHY हो जाती है। एप्लिकेशन को शुरू होने का समय देने के लिए startPeriod: 60 (सेकंड) सेट करें।

2. Task role और execution role को मिलाना

executionRole (ecsTaskExecutionRole): कंटेनर शुरू करने के लिए जरूरी permissions
  → ECR से image pull करना, CloudWatch Logs में लिखना

taskRole (myapp-task-role): एप्लिकेशन द्वारा उपयोग की जाने वाली permissions
  → DynamoDB, S3, SQS आदि तक पहुंच

गलत role में permissions जोड़ना बहुत आम गलती है।

3. awsvpc network mode में security group कॉन्फिगरेशन

Fargate के लिए awsvpc network mode जरूरी है। अगर कंटेनर के security group को सिर्फ ALB से ट्रैफिक तक सीमित करना भूल जाएं, तो कंटेनर सीधे इंटरनेट पर एक्सपोज हो जाता है।

4. Secrets Manager से fetch करने के लिए execution role जरूरी है

secrets से Secrets Manager का मान प्राप्त करने के लिए executionRole में secretsmanager:GetSecretValue permission होनी चाहिए। इस permission के न होने से कंटेनर अक्सर शुरू नहीं होता।

5. Deployment के दौरान desired_count: 0 की समस्या

Auto scaling में minimum 0 वाली service रात को सभी कंटेनर बंद कर सकती है, जिससे सुबह slow startup होती है। Production में minimum कम से कम 2 रखें।


सारांश

टास्कClaude Code का योगदान
Task definition जेनरेशनसिर्फ आवश्यकताओं से पूरा JSON
CDK implementationCluster, service, ALB, auto scaling एक साथ जेनरेट
CI/CD सेटअपGitHub Actions workflow जेनरेशन
Blue/Green deploymentAppSpec और CodeDeploy config स्वचालित रूप से जेनरेट
समस्या समाधानError logs से कारण और समाधान खोजना

ECS में बहुत सारे कॉन्फिगरेशन आइटम हैं, लेकिन Claude Code को “मुझे इस तरह का सेटअप चाहिए” बताने से आपको best practices के अनुसार पूरी कॉन्फिगरेशन मिल जाती है। CDK से शुरू करना सबसे आसान और अनुशंसित तरीका है।

संबंधित लेख

संदर्भ

#claude-code #aws #ecs #fargate #container #devops

अपने Claude Code वर्कफ़्लो को अगले स्तर पर ले जाएँ

Claude Code में तुरंत कॉपी-पेस्ट करने योग्य 50 आज़माए हुए प्रॉम्प्ट टेम्पलेट।

मुफ़्त

मुफ़्त PDF: 5 मिनट में Claude Code चीटशीट

बस अपना ईमेल दर्ज करें और हम तुरंत A4 एक-पृष्ठ चीटशीट PDF भेज देंगे।

हम आपकी व्यक्तिगत जानकारी की सुरक्षा करते हैं और स्पैम नहीं भेजते।

Masa

लेखक के बारे में

Masa

Claude Code का गहराई से उपयोग करने वाले इंजीनियर। claudecode-lab.com चलाते हैं, जो 10 भाषाओं में 2,000 से अधिक पेजों वाला टेक मीडिया है।

संबंधित लेख

Claude Code × Amazon Bedrock संपूर्ण गाइड | AWS पर Claude को प्रोडक्शन में चलाएं
Use Cases

Claude Code × Amazon Bedrock संपूर्ण गाइड | AWS पर Claude को प्रोडक्शन में चलाएं

Claude Code के साथ Amazon Bedrock उपयोग करने की संपूर्ण गाइड। IAM प्रमाणीकरण, स्ट्रीमिंग, Lambda इंटीग्रेशन, RAG कार्यान्वयन से लेकर लागत अनुकूलन तक — Masa के वास्तविक प्रोडक्शन अनुभव पर आधारित।

Claude Code × AWS CodePipeline/CodeBuild पूर्ण गाइड | CI/CD पाइपलाइन स्वचालित रूप से बनाएं
Use Cases

Claude Code × AWS CodePipeline/CodeBuild पूर्ण गाइड | CI/CD पाइपलाइन स्वचालित रूप से बनाएं

Claude Code का उपयोग करके AWS CodePipeline और CodeBuild के साथ CI/CD स्वचालित रूप से बनाएं। पाइपलाइन डिज़ाइन, buildspec.yml जेनरेशन, टेस्ट ऑटोमेशन और CDK इन्फ्रास्ट्रक्चर के व्यावहारिक कोड उदाहरण।

Claude Code × AWS CloudWatch सम्पूर्ण गाइड | लॉग विश्लेषण, अलार्म सेटअप और डैशबोर्ड ऑटोमेशन
Use Cases

Claude Code × AWS CloudWatch सम्पूर्ण गाइड | लॉग विश्लेषण, अलार्म सेटअप और डैशबोर्ड ऑटोमेशन

Claude Code से AWS CloudWatch को और प्रभावी बनाएं। लॉग पैटर्न विश्लेषण, स्वचालित अलार्म कॉन्फ़िगरेशन, मेट्रिक्स डैशबोर्ड और इंसिडेंट जांच के लिए व्यावहारिक कोड।