AWS Identity and Access Management 템플릿 코드 조각 - AWS CloudFormation

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, PutObjectPutObjectAcl 작업을 허용하는 arn:aws:s3:::myAWSBucket 속성이 포함되어 있습니다. mypolicy 리소스는 기존 그룹 myexistinggroup1과 템플릿에 AWS::IAM::Group 리소스로 선언된 mygroup 그룹에 정책을 적용합니다. 이 예에서는 Groups 속성을 사용하여 그룹에 정책을 적용하는 방법을 보여주지만 대신 Users 속성을 사용하여 사용자 목록에 정책 문서를 추가할 수도 있습니다.

중요

AWS::IAM::Policy 리소스에 선언된 Amazon SNS 정책 작업은 AWS::SNS::TopicPolicy 리소스에 선언된 Amazon SNS 주제 정책 작업과 다릅니다. 예를 들어 sns:Unsubscribesns: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 리소스 myuserAWS::SNS::Topic 리소스 mytopic에 대해 Publish 작업을 수행하도록 허용하는 PolicyDocument 속성이 포함되어 있습니다. 이 코드 조각에서 Fn::GetAtt 함수는 myuser 리소스의 ARN을 가져오고, Ref 함수는 mytopic 리소스의 ARN을 가져옵니다.

중요

AWS::IAM::Policy 리소스에 선언된 Amazon SNS 정책 작업은 AWS::SNS::TopicPolicy 리소스에 선언된 Amazon SNS 주제 정책 작업과 다릅니다. 예를 들어 sns:Unsubscribesns: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-2us-east-2.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.us-east-2.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