AWS Identity and Access Management 템플릿 코드 조각
이 단원에는 AWS Identity and Access Management 템플릿 조각이 포함되어 있습니다.
주제
중요
IAM 리소스가 포함된 템플릿을 사용하여 스택을 생성 또는 업데이트하는 경우 IAM 기능의 사용을 승인해야 합니다. 템플릿에서 IAM 리소스를 사용하는 방법에 대한 자세한 내용은 AWS Identity and Access Management을 통한 액세스 제어 단원을 참조하십시오.
IAM 사용자 리소스 선언
이 코드 조각에서는 IAM 사용자를 생성하기 위해 AWS::IAM::User 리소스를 선언하는 방법을 보여줍니다. 사용자는 경로("/"
)와 암호가 포함된 로그인 프로파일(myP@ssW0rd
)로 선언됩니다.
정책 문서 giveaccesstoqueueonly
는 Amazon SQS 대기열 리소스 myqueue
에 대해 모든 Amazon SQS 작업을 수행할 수 있는 사용자 권한을 부여하고 기타 모든 Amazon SQS 대기열 리소스에 대한 액세스를 거부합니다. Fn::GetAtt
함수는 AWS::SQS::Queue 리소스 myqueue
의 Arn 속성을 가져옵니다.
Amazon SNS 주제 리소스 mytopic
에 대해 모든 Amazon SNS 작업을 수행하고 기타 모든 Amazon SNS 리소스에 대한 액세스를 거부할 수 있는 사용자 권한을 부여하는 정책 문서 giveaccesstotopiconly
가 사용자에게 추가됩니다. Ref
함수는 AWS::SNS::Topic 리소스 mytopic
의 ARN을 가져옵니다.
JSON
"myuser" : { "Type" : "AWS::IAM::User", "Properties" : { "Path" : "/", "LoginProfile" : { "Password" : "myP@ssW0rd" }, "Policies" : [ { "PolicyName" : "giveaccesstoqueueonly", "PolicyDocument" : { "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : [ "sqs:*" ], "Resource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ] }, { "Effect" : "Deny", "Action" : [ "sqs:*" ], "NotResource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ] } ] } }, { "PolicyName" : "giveaccesstotopiconly", "PolicyDocument" : { "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : [ "sns:*" ], "Resource" : [ { "Ref" : "mytopic" } ] }, { "Effect" : "Deny", "Action" : [ "sns:*" ], "NotResource" : [ { "Ref" : "mytopic" } ] } ] } } ] } }
YAML
myuser: Type: AWS::IAM::User Properties: Path: "/" LoginProfile: Password: myP@ssW0rd Policies: - PolicyName: giveaccesstoqueueonly PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - sqs:* Resource: - !GetAtt myqueue.Arn - Effect: Deny Action: - sqs:* NotResource: - !GetAtt myqueue.Arn - PolicyName: giveaccesstotopiconly PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - sns:* Resource: - !Ref mytopic - Effect: Deny Action: - sns:* NotResource: - !Ref mytopic
IAM 액세스 키 리소스 선언
이 코드 조각은 AWS::IAM::AccessKey 리소스를 보여줍니다. myaccesskey
리소스는 액세스 키를 생성하여 템플릿에 AWS::IAM::User 리소스로 선언된 IAM 사용자에게 할당합니다.
JSON
"myaccesskey" : { "Type" : "AWS::IAM::AccessKey", "Properties" : { "UserName" : { "Ref" : "myuser" } } }
YAML
myaccesskey: Type: AWS::IAM::AccessKey Properties: UserName: !Ref myuser
AWS::IAM::AccessKey
함수를 사용하여 Fn::GetAtt
리소스에 대한 보안 키를 가져올 수 있습니다. 보안 키는 Output
값에 보안 키를 입력한 경우에만 검색할 수 있습니다. Ref
함수를 사용하면 액세스 키를 가져올 수 있습니다. 다음 Output
값 선언에서는 myaccesskey
에 대한 액세스 키 및 보안 키를 가져옵니다.
JSON
"AccessKeyformyaccesskey" : { "Value" : { "Ref" : "myaccesskey" } }, "SecretKeyformyaccesskey" : { "Value" : { "Fn::GetAtt" : [ "myaccesskey", "SecretAccessKey" ] } }
YAML
AccessKeyformyaccesskey: Value: !Ref myaccesskey SecretKeyformyaccesskey: Value: !GetAtt myaccesskey.SecretAccessKey
또한 템플릿에 정의된 Amazon EC2 인스턴스 또는 오토 스케일링에 AWS 액세스 키 및 보안 키를 전달할 수도 있습니다. 다음 AWS::EC2::Instance 선언에서는 UserData
속성을 사용하여 myaccesskey
리소스에 대한 액세스 키 및 보안 키를 전달합니다.
JSON
"myinstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "AvailabilityZone" : "us-east-1a", "ImageId" : "ami-0ff8a91507f77f867", "UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", [ "ACCESS_KEY=", { "Ref" : "myaccesskey" }, "&", "SECRET_KEY=", { "Fn::GetAtt" : [ "myaccesskey", "SecretAccessKey" ] } ] ] } } } }
YAML
myinstance: Type: AWS::EC2::Instance Properties: AvailabilityZone: "us-east-1a" ImageId: ami-0ff8a91507f77f867 UserData: Fn::Base64: !Sub "ACCESS_KEY=${myaccesskey}&SECRET_KEY=${myaccesskey.SecretAccessKey}"
IAM 그룹 리소스 선언
이 코드 조각은 AWS::IAM::Group 리소스를 보여줍니다. 그룹에는 경로("/myapplication/"
)가 있습니다. 그룹의 사용자가 Amazon SQS 대기열 리소스 myqueue에 대해 모든 Amazon SQS 작업을 수행하고 myqueue
를 제외한 기타 모든 Amazon SQS 리소스에 대한 액세스를 거부하도록 허용하는 정책 문서 myapppolicy
가 그룹에 추가됩니다.
리소스에 정책을 할당하려면 IAM에는 해당 리소스에 대한 Amazon 리소스 이름(ARN)이 필요합니다. 코드 조각에서 Fn::GetAtt
함수는 AWS::SQS::Queue 리소스 대기열의 ARN을 가져옵니다.
JSON
"mygroup" : { "Type" : "AWS::IAM::Group", "Properties" : { "Path" : "/myapplication/", "Policies" : [ { "PolicyName" : "myapppolicy", "PolicyDocument" : { "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : [ "sqs:*" ], "Resource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ] }, { "Effect" : "Deny", "Action" : [ "sqs:*" ], "NotResource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ] } ] } } ] } }
YAML
mygroup: Type: AWS::IAM::Group Properties: Path: "/myapplication/" Policies: - PolicyName: myapppolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - sqs:* Resource: !GetAtt myqueue.Arn - Effect: Deny Action: - sqs:* NotResource: !GetAtt myqueue.Arn
그룹에 사용자 추가
AWS::IAM::UserToGroupAddition 리소스는 그룹에 사용자를 추가합니다. 다음 코드 조각에서 addUserToGroup
리소스는 기존 사용자 existinguser1
과 템플릿에 AWS::IAM::User 리소스로 선언된 사용자 myuser
를 기존 그룹 myexistinggroup2
에 추가합니다.
JSON
"addUserToGroup" : { "Type" : "AWS::IAM::UserToGroupAddition", "Properties" : { "GroupName" : "myexistinggroup2", "Users" : [ "existinguser1", { "Ref" : "myuser" } ] } }
YAML
addUserToGroup: Type: AWS::IAM::UserToGroupAddition Properties: GroupName: myexistinggroup2 Users: - existinguser1 - !Ref myuser
IAM 정책 선언
이 코드 조각은 mypolicy
라는 AWS::IAM::Policy 리소스를 사용하여 정책을 생성해 여러 그룹에 적용하는 방법을 보여줍니다. mypolicy
리소스에는 ARN PolicyDocument
으로 표시되는 S3 버킷에 있는 객체에 대해 GetObject
, PutObject
및 PutObjectAcl
작업을 허용하는 arn:aws:s3:::myAWSBucket
속성이 포함되어 있습니다. mypolicy
리소스는 기존 그룹 myexistinggroup1
과 템플릿에 AWS::IAM::Group 리소스로 선언된 mygroup
그룹에 정책을 적용합니다. 이 예에서는 Groups
속성을 사용하여 그룹에 정책을 적용하는 방법을 보여주지만 대신 Users
속성을 사용하여 사용자 목록에 정책 문서를 추가할 수도 있습니다.
중요
AWS::IAM::Policy 리소스에 선언된 Amazon SNS 정책 작업은 AWS::SNS::TopicPolicy 리소스에 선언된 Amazon SNS 주제 정책 작업과 다릅니다. 예를 들어 sns:Unsubscribe
및 sns:SetSubscriptionAttributes
정책 작업은 AWS::IAM::Policy
리소스에 사용할 수 있지만 AWS::SNS::TopicPolicy
리소스에는 유효하지 않습니다. AWS::IAM::Policy
리소스와 함께 사용할 수 있는 유효한 Amazon SNS 정책 작업에 대한 자세한 내용을 알아보려면 Amazon Simple Notification Service 개발자 안내서의 Amazon SNS 정책에 대한 특별 정보를 참조하세요.
JSON
"mypolicy" : { "Type" : "AWS::IAM::Policy", "Properties" : { "PolicyName" : "mygrouppolicy", "PolicyDocument" : { "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : [ "s3:GetObject" , "s3:PutObject" , "s3:PutObjectAcl" ], "Resource" : "arn:aws:s3:::myAWSBucket/*" } ] }, "Groups" : [ "myexistinggroup1", { "Ref" : "mygroup" } ] } }
YAML
mypolicy: Type: AWS::IAM::Policy Properties: PolicyName: mygrouppolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetObject - s3:PutObject - s3:PutObjectAcl Resource: arn:aws:s3:::myAWSBucket/* Groups: - myexistinggroup1 - !Ref mygroup
Amazon S3 버킷 정책 선언
이 코드 조각은 AWS::S3::BucketPolicy 리소스를 사용하여 정책을 생성해 Amazon S3 버킷에 적용하는 방법을 보여줍니다. mybucketpolicy
리소스는 user1
IAM 사용자가 정책이 적용되는 S3 버킷의 모든 객체에 대해 GetObject
작업을 수행하도록 허용하는 정책 문서를 선언합니다. 코드 조각에서 Fn::GetAtt
함수는 user1
리소스의 ARN을 가져옵니다. mybucketpolicy
리소스는 AWS::S3::BucketPolicy
리소스 mybucket에 정책을 적용합니다. Ref
함수는 mybucket
리소스의 버킷 이름을 가져옵니다.
JSON
"mybucketpolicy" : { "Type" : "AWS::S3::BucketPolicy", "Properties" : { "PolicyDocument" : { "Id" : "MyPolicy", "Version": "2012-10-17", "Statement" : [ { "Sid" : "ReadAccess", "Action" : [ "s3:GetObject" ], "Effect" : "Allow", "Resource" : { "Fn::Join" : [ "", [ "arn:aws:s3:::", { "Ref" : "mybucket" } , "/*" ] ] }, "Principal" : { "AWS" : { "Fn::GetAtt" : [ "user1", "Arn" ] } } } ] }, "Bucket" : { "Ref" : "mybucket" } } }
YAML
mybucketpolicy: Type: AWS::S3::BucketPolicy Properties: PolicyDocument: Id: MyPolicy Version: '2012-10-17' Statement: - Sid: ReadAccess Action: - s3:GetObject Effect: Allow Resource: !Sub "arn:aws:s3:::${mybucket}/*" Principal: AWS: !GetAtt user1.Arn Bucket: !Ref mybucket
Amazon SNS 주제 정책 선언
이 코드 조각은 AWS::SNS::TopicPolicy 리소스를 사용하여 정책을 생성해 Amazon SNS 주제에 적용하는 방법을 보여줍니다. mysnspolicy
리소스에는 AWS::IAM::User 리소스 myuser
가 AWS::SNS::Topic 리소스 mytopic
에 대해 Publish
작업을 수행하도록 허용하는 PolicyDocument
속성이 포함되어 있습니다. 이 코드 조각에서 Fn::GetAtt
함수는 myuser
리소스의 ARN을 가져오고, Ref
함수는 mytopic
리소스의 ARN을 가져옵니다.
중요
AWS::IAM::Policy 리소스에 선언된 Amazon SNS 정책 작업은 AWS::SNS::TopicPolicy 리소스에 선언된 Amazon SNS 주제 정책 작업과 다릅니다. 예를 들어 sns:Unsubscribe
및 sns:SetSubscriptionAttributes
정책 작업은 AWS::IAM::Policy
리소스에 사용할 수 있지만 AWS::SNS::TopicPolicy
리소스에는 유효하지 않습니다. AWS::IAM::Policy
리소스와 함께 사용할 수 있는 유효한 Amazon SNS 정책 작업에 대한 자세한 내용을 알아보려면 Amazon Simple Notification Service 개발자 안내서의 Amazon SNS 정책에 대한 특별 정보를 참조하세요.
JSON
"mysnspolicy" : { "Type" : "AWS::SNS::TopicPolicy", "Properties" : { "PolicyDocument" : { "Id" : "MyTopicPolicy", "Version" : "2012-10-17", "Statement" : [ { "Sid" : "My-statement-id", "Effect" : "Allow", "Principal" : { "AWS" : { "Fn::GetAtt" : [ "myuser", "Arn" ] } }, "Action" : "sns:Publish", "Resource" : "*" } ] }, "Topics" : [ { "Ref" : "mytopic" } ] } }
YAML
mysnspolicy: Type: AWS::SNS::TopicPolicy Properties: PolicyDocument: Id: MyTopicPolicy Version: '2012-10-17' Statement: - Sid: My-statement-id Effect: Allow Principal: AWS: !GetAtt myuser.Arn Action: sns:Publish Resource: "*" Topics: - !Ref mytopic
Amazon SQS 정책 선언
이 코드 조각은 AWS::SQS::QueuePolicy 리소스를 사용하여 정책을 생성해 Amazon SQS 대기열에 적용하는 방법을 보여줍니다. PolicyDocument
속성은 기존 사용자 myapp
(ARN으로 지정됨)가 기존 대기열(URL로 지정됨) 및 AWS::SQS::Queue 리소스 myqueue에 대해 SendMessage
작업을 수행하도록 허용합니다. Ref 함수는 myqueue
리소스 URL을 가져옵니다.
JSON
"mysqspolicy" : { "Type" : "AWS::SQS::QueuePolicy", "Properties" : { "PolicyDocument" : { "Id" : "MyQueuePolicy", "Version" : "2012-10-17", "Statement" : [ { "Sid" : "Allow-User-SendMessage", "Effect" : "Allow", "Principal" : { "AWS" : "arn:aws:iam::123456789012:user/myapp" }, "Action" : [ "sqs:SendMessage" ], "Resource" : "*" } ] }, "Queues" : [ "https://sqs.us-east-2
aws-region
.amazonaws.com/123456789012/myexistingqueue", { "Ref" : "myqueue" } ] } }
YAML
mysqspolicy: Type: AWS::SQS::QueuePolicy Properties: PolicyDocument: Id: MyQueuePolicy Version: '2012-10-17' Statement: - Sid: Allow-User-SendMessage Effect: Allow Principal: AWS: arn:aws:iam::123456789012:user/myapp Action: - sqs:SendMessage Resource: "*" Queues: - https://sqs.
aws-region
.amazonaws.com/123456789012/myexistingqueue - !Ref myqueue
IAM 역할 템플릿의 예
이 섹션에서는 EC2 인스턴스에 대한 IAM 역할의 CloudFormation 템플릿 예제를 제공합니다.
IAM 역할에 대한 자세한 내용을 알아보려면 AWS Identity and Access Management 사용 설명서의 IAM 역할을 참조하세요.
EC2 관련 IAM 역할
이 예에서 인스턴스 프로파일은 EC2 인스턴스의 IamInstanceProfile
속성에서 참조합니다. 인스턴스 정책 및 역할 정책 둘 다에서 AWS::IAM::Role을 참조합니다.
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "myEC2Instance": { "Type": "AWS::EC2::Instance", "Version": "2009-05-15", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "m1.small", "Monitoring": "true", "DisableApiTermination": "false", "IamInstanceProfile": { "Ref": "RootInstanceProfile" } } }, "RootRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version" : "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "ec2.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] } ] }, "Path": "/" } }, "RolePolicies": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyName": "root", "PolicyDocument": { "Version" : "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ] }, "Roles": [ { "Ref": "RootRole" } ] } }, "RootInstanceProfile": { "Type": "AWS::IAM::InstanceProfile", "Properties": { "Path": "/", "Roles": [ { "Ref": "RootRole" } ] } } } }
YAML
AWSTemplateFormatVersion: '2010-09-09' Resources: myEC2Instance: Type: AWS::EC2::Instance Version: '2009-05-15' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: m1.small Monitoring: 'true' DisableApiTermination: 'false' IamInstanceProfile: !Ref RootInstanceProfile RootRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - ec2.amazonaws.com Action: - sts:AssumeRole Path: "/" RolePolicies: Type: AWS::IAM::Policy Properties: PolicyName: root PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: "*" Resource: "*" Roles: - !Ref RootRole RootInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Path: "/" Roles: - !Ref RootRole
AutoScaling 그룹 관련 IAM 역할
이 예제에서 인스턴스 프로파일은 오토 스케일링 시작 구성의 IamInstanceProfile
속성에서 참조합니다.
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "myLCOne": { "Type": "AWS::AutoScaling::LaunchConfiguration", "Version": "2009-05-15", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "m1.small", "InstanceMonitoring": "true", "IamInstanceProfile": { "Ref": "RootInstanceProfile" } } }, "myASGrpOne": { "Type": "AWS::AutoScaling::AutoScalingGroup", "Version": "2009-05-15", "Properties": { "AvailabilityZones": [ "us-east-1a" ], "LaunchConfigurationName": { "Ref": "myLCOne" }, "MinSize": "0", "MaxSize": "0", "HealthCheckType": "EC2", "HealthCheckGracePeriod": "120" } }, "RootRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version" : "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "ec2.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] } ] }, "Path": "/" } }, "RolePolicies": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyName": "root", "PolicyDocument": { "Version" : "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" } ] }, "Roles": [ { "Ref": "RootRole" } ] } }, "RootInstanceProfile": { "Type": "AWS::IAM::InstanceProfile", "Properties": { "Path": "/", "Roles": [ { "Ref": "RootRole" } ] } } } }
YAML
AWSTemplateFormatVersion: '2010-09-09' Resources: myLCOne: Type: AWS::AutoScaling::LaunchConfiguration Version: '2009-05-15' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: m1.small InstanceMonitoring: 'true' IamInstanceProfile: !Ref RootInstanceProfile myASGrpOne: Type: AWS::AutoScaling::AutoScalingGroup Version: '2009-05-15' Properties: AvailabilityZones: - "us-east-1a" LaunchConfigurationName: !Ref myLCOne MinSize: '0' MaxSize: '0' HealthCheckType: EC2 HealthCheckGracePeriod: '120' RootRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - ec2.amazonaws.com Action: - sts:AssumeRole Path: "/" RolePolicies: Type: AWS::IAM::Policy Properties: PolicyName: root PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: "*" Resource: "*" Roles: - !Ref RootRole RootInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Path: "/" Roles: - !Ref RootRole