Elastic Beanstalk 소개
Elastic Beanstalk은 AWS에서 제공하는 관리형 서비스로, 웹 애플리케이션과 서비스를 쉽게 배포하고 관리할 수 있게 해줍니다. 개발자는 인프라 관리에 신경 쓰지 않고 코드를 업로드하기만 하면, Elastic Beanstalk이 자동으로 인프라를 프로비저닝하고 애플리케이션을 배포해줍니다.
IAM 역할과 정책의 중요성
Elastic Beanstalk은 다양한 AWS 서비스와 상호작용하기 때문에, 필요한 권한을 관리하기 위해 IAM(Identity and Access Management) 역할과 정책이 중요합니다. 올바른 IAM 역할과 정책을 설정하면 애플리케이션이 안전하게 운영되며, 불필요한 권한으로 인한 보안 리스크를 줄일 수 있습니다.
1. Elastic Beanstalk을 위한 IAM 역할 및 정책 이해
IAM 역할(Role)과 정책(Policy) 개요
IAM 역할(Role)은 특정 AWS 리소스에 접근할 수 있는 권한을 가진 엔터티입니다. 사용자는 역할을 통해 AWS 서비스와 상호작용할 수 있으며, 역할에는 정책(Policy)이 연결되어 있어, 허용된 액션과 리소스를 정의합니다.
Elastic Beanstalk에서의 IAM 역할 사용 사례
Elastic Beanstalk에서 IAM 역할은 애플리케이션이 다른 AWS 서비스 (예: S3, DynamoDB, RDS)와 상호작용할 수 있도록 하는 중요한 구성 요소입니다. 예를 들어, 애플리케이션이 S3에서 파일을 읽거나 쓰기 위해서는 적절한 권한이 있는 IAM 역할이 필요합니다.
2. Elastic Beanstalk을 위한 IAM 역할 생성
필요한 권한 식별
Elastic Beanstalk에는 기본적으로 EC2 인스턴스, Auto Scaling, Load Balancer 등의 서비스에 대한 권한이 필요합니다. 하지만, 애플리케이션에 따라 추가적으로 S3, CloudWatch, RDS 등 다른 AWS 서비스에 접근해야 할 수도 있습니다.
IAM 역할 생성 단계별 가이드
서비스 정책 생성 : 아래 JSON을 복사하여 " AWSElasticBeanstalkService" 이름으로 IAM 정책을 생성합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudformationOperationsOnElasticBeanstalkStacks",
"Effect": "Allow",
"Action": [
"cloudformation:*"
],
"Resource": [
"arn:aws:cloudformation:*:*:stack/awseb-*",
"arn:aws:cloudformation:*:*:stack/eb-*"
]
},
{
"Sid": "AllowDeleteCloudwatchLogGroups",
"Effect": "Allow",
"Action": [
"logs:DeleteLogGroup"
],
"Resource": [
"arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*"
]
},
{
"Sid": "AllowECSTagResource",
"Effect": "Allow",
"Action": [
"ecs:TagResource"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"ecs:CreateAction": [
"CreateCluster",
"RegisterTaskDefinition"
]
}
}
},
{
"Sid": "AllowS3OperationsOnElasticBeanstalkBuckets",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::elasticbeanstalk-*",
"arn:aws:s3:::elasticbeanstalk-*/*"
]
},
{
"Sid": "AllowLaunchTemplateRunInstances",
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": "*",
"Condition": {
"ArnLike": {
"ec2:LaunchTemplate": "arn:aws:ec2:*:*:launch-template/*"
}
}
},
{
"Sid": "AllowELBAddTags",
"Effect": "Allow",
"Action": [
"elasticloadbalancing:AddTags"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"elasticloadbalancing:CreateAction": [
"CreateLoadBalancer"
]
}
}
},
{
"Sid": "AllowOperations",
"Effect": "Allow",
"Action": [
"autoscaling:AttachInstances",
"autoscaling:CreateAutoScalingGroup",
"autoscaling:CreateLaunchConfiguration",
"autoscaling:CreateOrUpdateTags",
"autoscaling:DeleteLaunchConfiguration",
"autoscaling:DeleteAutoScalingGroup",
"autoscaling:DeleteScheduledAction",
"autoscaling:DescribeAccountLimits",
"autoscaling:DescribeAutoScalingGroups",
"autoscaling:DescribeAutoScalingInstances",
"autoscaling:DescribeLaunchConfigurations",
"autoscaling:DescribeLoadBalancers",
"autoscaling:DescribeNotificationConfigurations",
"autoscaling:DescribeScalingActivities",
"autoscaling:DescribeScheduledActions",
"autoscaling:DetachInstances",
"autoscaling:DeletePolicy",
"autoscaling:PutScalingPolicy",
"autoscaling:PutScheduledUpdateGroupAction",
"autoscaling:PutNotificationConfiguration",
"autoscaling:ResumeProcesses",
"autoscaling:SetDesiredCapacity",
"autoscaling:SuspendProcesses",
"autoscaling:TerminateInstanceInAutoScalingGroup",
"autoscaling:UpdateAutoScalingGroup",
"cloudwatch:PutMetricAlarm",
"ec2:AssociateAddress",
"ec2:AllocateAddress",
"ec2:AuthorizeSecurityGroupEgress",
"ec2:AuthorizeSecurityGroupIngress",
"ec2:CreateLaunchTemplate",
"ec2:CreateLaunchTemplateVersion",
"ec2:DescribeLaunchTemplates",
"ec2:DescribeLaunchTemplateVersions",
"ec2:DeleteLaunchTemplate",
"ec2:DeleteLaunchTemplateVersions",
"ec2:CreateSecurityGroup",
"ec2:DeleteSecurityGroup",
"ec2:DescribeAccountAttributes",
"ec2:DescribeAddresses",
"ec2:DescribeImages",
"ec2:DescribeInstances",
"ec2:DescribeKeyPairs",
"ec2:DescribeSecurityGroups",
"ec2:DescribeSnapshots",
"ec2:DescribeSubnets",
"ec2:DescribeVpcs",
"ec2:DescribeInstanceAttribute",
"ec2:DescribeSpotInstanceRequests",
"ec2:DescribeVpcClassicLink",
"ec2:DisassociateAddress",
"ec2:ReleaseAddress",
"ec2:RevokeSecurityGroupEgress",
"ec2:RevokeSecurityGroupIngress",
"ec2:TerminateInstances",
"ecs:CreateCluster",
"ecs:DeleteCluster",
"ecs:DescribeClusters",
"ecs:RegisterTaskDefinition",
"elasticbeanstalk:*",
"elasticloadbalancing:ApplySecurityGroupsToLoadBalancer",
"elasticloadbalancing:ConfigureHealthCheck",
"elasticloadbalancing:CreateLoadBalancer",
"elasticloadbalancing:DeleteLoadBalancer",
"elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
"elasticloadbalancing:DescribeInstanceHealth",
"elasticloadbalancing:DescribeLoadBalancers",
"elasticloadbalancing:DescribeTargetHealth",
"elasticloadbalancing:RegisterInstancesWithLoadBalancer",
"elasticloadbalancing:DescribeTargetGroups",
"elasticloadbalancing:RegisterTargets",
"elasticloadbalancing:DeregisterTargets",
"iam:ListRoles",
"iam:PassRole",
"logs:CreateLogGroup",
"logs:PutRetentionPolicy",
"logs:DescribeLogGroups",
"rds:DescribeDBEngineVersions",
"rds:DescribeDBInstances",
"rds:DescribeOrderableDBInstanceOptions",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:ListBucket",
"sns:CreateTopic",
"sns:GetTopicAttributes",
"sns:ListSubscriptionsByTopic",
"sns:Subscribe",
"sns:SetTopicAttributes",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl",
"codebuild:CreateProject",
"codebuild:DeleteProject",
"codebuild:BatchGetBuilds",
"codebuild:StartBuild"
],
"Resource": [
"*"
]
}
]
}
AWS Elastic Beanstalk과 관련된 리소스에 대해 다양한 권한을 부여하는 정책입니다. 각 섹션(Statement)별로 설명드리겠습니다.
1. AllowCloudformationOperationsOnElasticBeanstalkStacks
설명 : 이 섹션은 CloudFormation 스택에서 모든 작업(cloudformation:*)을 허용합니다. 하지만, 해당 스택의 이름이 awseb-* 또는 eb-*로 시작하는 경우에만 허용됩니다.
주요 권한 : CloudFormation 관련 작업 전체(cloudformation:*).
적용 대상 리소스 : arn:aws:cloudformation:*:*:stack/awseb-*, arn:aws:cloudformation:*:*:stack/eb-*.
2. AllowDeleteCloudwatchLogGroups
설명 : 이 섹션은 Elastic Beanstalk과 관련된 CloudWatch 로그 그룹을 삭제할 수 있는 권한을 부여합니다.
주요 권한 : CloudWatch 로그 그룹 삭제(logs:DeleteLogGroup).
적용 대상 리소스 : arn:aws:logs:*:*:log-group:/aws/elasticbeanstalk*.
3. AllowECSTagResource
설명 : 이 섹션은 ECS 리소스에 태그를 붙일 수 있는 권한을 부여합니다. 단, 이 권한은 CreateCluster나 RegisterTaskDefinition과 같은 작업이 수행될 때만 유효합니다.
주요 권한 : ECS 리소스에 태그 부착(ecs:TagResource).
적용 대상 리소스 : 모든 리소스(*).
조건 : ecs:CreateAction이 CreateCluster 또는 RegisterTaskDefinition일 때.
4. AllowS3OperationsOnElasticBeanstalkBuckets
설명 : Elastic Beanstalk과 관련된 S3 버킷에 대해 모든 S3 작업을 허용합니다.
주요 권한 : S3 관련 작업 전체(s3:*).
적용 대상 리소스 : arn:aws:s3:::elasticbeanstalk-*, arn:aws:s3:::elasticbeanstalk-*/*.
5. AllowLaunchTemplateRunInstances
설명 : 이 섹션은 EC2 인스턴스를 실행(RunInstances)할 수 있는 권한을 부여합니다. 단, 실행되는 인스턴스는 특정 조건에 따라야 합니다.
주요 권한 : EC2 인스턴스 실행(ec2:RunInstances).
적용 대상 리소스 : 모든 리소스(*).
조건 : ec2:LaunchTemplate ARN이 arn:aws:ec2:*:*:launch-template/*와 일치해야 합니다.
6. AllowELBAddTags
설명 : Elastic Load Balancer(ELB)에 태그를 추가할 수 있는 권한을 부여합니다. 단, 이 권한은 로드 밸런서가 생성될 때만 유효합니다.
주요 권한 : ELB 태그 추가(elasticloadbalancing:AddTags).
적용 대상 리소스 : 모든 리소스(*).
조건 : elasticloadbalancing:CreateAction이 CreateLoadBalancer일 때.
7. AllowOperations
설명 : 이 섹션은 Elastic Beanstalk 환경에서 애플리케이션을 운영하는 데 필요한 다양한 AWS 서비스에 대한 권한을 광범위하게 허용합니다.
주요 권한 : Auto Scaling, EC2, ECS, Elastic Beanstalk, ELB, IAM, CloudWatch, RDS, S3, SNS, SQS, CodeBuild 등 여러 서비스에 대한 권한.
적용 대상 리소스 : 모든 리소스(*).
이 정책은 Elastic Beanstalk 환경에서의 인프라와 애플리케이션 관리를 위한 매우 광범위한 권한을 포함하고 있으며, Elastic Beanstalk에 필요한 거의 모든 작업을 수행할 수 있도록 설계되었습니다. 각 권한은 특정 리소스에 제한을 두거나 특정 조건 하에서만 허용되도록 구성되어 있어, 보안성을 유지하면서도 필요한 작업을 수행할 수 있게 합니다.
서비스 역할 생성 : "aws-elasticbeanstalk-service-role" 이름으로 elastic beanstalk 역할 생성
AWSElasticBeanstalkService 정책에 aws-elasticbeanstalk-service-role 역할 연결
aws-elasticbeanstalk-ec2-role 역할 생성, 아래 정책을 추가합니다.
AmazonEC2ContainerRegistryReadOnly,AWSElasticBeanstalkWebTier,
AWSElasticBeanstalkWorkerTier
AWSElasticBeanstalkMulticontainerDocker,