CodePipeline을 사용하여 위임된 관리자 계정에 서비스 관리형 CloudFormation StackSet을 배포하려면 어떻게 해야 합니까?
AWS CodePipeline을 사용하여 AWS Organizations의 조직 단위(OU)를 대상으로 하는 AWS CloudFormation StackSet을 배포하려고 합니다. 서비스 관리형 권한을 사용하여 위임된 관리자 계정에 스택을 배포하고 싶습니다.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
전제 조건: AWS CloudFormation StackSets와 Organizations 간의 신뢰할 수 있는 액세스를 활성화합니다. 권한에 대한 내용은 신뢰할 수 있는 액세스를 사용하는 데 필요한 권한을 참조하십시오. 신뢰할 수 있는 액세스를 활성화하려면 관리 계정의 관리자 사용자여야 합니다.
위임된 관리자 계정 등록
멤버 계정을 관리자 계정으로 위임하려면 다음 register-delegated-administrator AWS CLI 명령을 실행합니다.
aws organizations register-delegated-administrator \ --service-principal=member.org.stacksets.cloudformation.amazonaws.com \ --account-id="111122223333"
참고: 111122223333을 계정 ID로 바꾸십시오.
등록을 확인하려면 다음 list-delegated-administrators CLI 명령을 실행합니다.
aws organizations list-delegated-administrators \ --service-principal=member.org.stacksets.cloudformation.amazonaws.com
파이프라인 설정
CloudFormation 작업을 허용하는 파이프라인을 만들려면 Codepipeline 콘솔 또는 AWS CLI를 사용할 수 있습니다.
콘솔 사용
CodePipeline 콘솔을 사용하여 파이프라인을 만들려면 정적 템플릿에서 파이프라인 생성를 참조하십시오. 템플릿 구성에 다음 cp-template.yaml 템플릿을 추가합니다.
AWSTemplateFormatVersion: "2010-09-09" Parameters: TargetRegions: Type: String Resources: Bucket: Type: "AWS::S3::Bucket" DeletionPolicy: Retain Properties: VersioningConfiguration: Status: Enabled ServiceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: - codepipeline.amazonaws.com Action: - sts:AssumeRole Policies: - PolicyName: CodePipelinePermissions PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - s3:GetObject - s3:GetObjectVersion - s3:GetBucketVersioning - s3:PutObject - s3:PutObjectAcl Resource: - !Sub arn:aws:s3:::${Bucket} - !Sub arn:aws:s3:::${Bucket}/* - Effect: Allow Action: - cloudformation:CreateStackSet - cloudformation:UpdateStackSet - cloudformation:DeleteStackSet - cloudformation:DescribeStackSet - cloudformation:DescribeStackSetOperation - cloudformation:ListStackInstances - cloudformation:CreateStackInstances Resource: "*" - Effect: Allow Action: - organizations:ListDelegatedAdministrators Resource: "*" Pipeline: Type: AWS::CodePipeline::Pipeline Properties: RoleArn: !GetAtt ServiceRole.Arn ArtifactStore: Type: S3 Location: !Ref Bucket Stages: - Name: Source Actions: - Name: SourceAction ActionTypeId: Category: Source Owner: AWS Provider: S3 Version: "1" Configuration: S3Bucket: !Ref Bucket S3ObjectKey: "source.zip" PollForSourceChanges: false OutputArtifacts: - Name: SourceArtifact - Name: Deploy Actions: - Name: ServiceManaged-SS RunOrder: "1" ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormationStackSet Version: "1" Configuration: PermissionModel: SERVICE_MANAGED CallAs: DELEGATED_ADMIN OrganizationsAutoDeployment: Enabled Regions: !Ref TargetRegions StackSetName: !Sub codepipeline-deployed-cfn-${AWS::AccountId}-stackset MaxConcurrentPercentage: "50" FailureTolerancePercentage: "100" ConcurrencyMode: SOFT_FAILURE_TOLERANCE Capabilities: CAPABILITY_NAMED_IAM,CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND DeploymentTargets: "SourceArtifact::ou.txt" TemplatePath: "SourceArtifact::template.yaml" Parameters: "SourceArtifact::parameters.txt" InputArtifacts: - Name: SourceArtifact
참고: CallAs에 지정한 AWS Identity and Access Management(IAM) 서비스 역할에는 organizations:ListDelegatedAdministrators 권한이 있어야 합니다.
AWS CLI 사용
AWS CLI를 사용하여 파이프라인을 만들려면 파이프라인 생성(CLI)을 참조하십시오.
(선택 사항) 스택 생성
템플릿을 사용하여 파이프라인을 만들지 않는 경우 CloudFormation에서 파이프라인의 스택을 만들어야 합니다.
콘솔 사용
CloudFormation 콘솔을 사용하여 스택을 만들려면 스택 생성을 참조하십시오. 파라미터 섹션에서 StackSet 인스턴스가 배포되는 AWS 리전을 추가합니다. 예를 들어, TargetRegions에 aa-example-1, aa-example-2를 포함합니다. CallAs에 지정한 IAM 서비스 역할에 organizations:ListDelegatedAdministrators 권한이 있는지 확인하십시오.
참고: 스택을 만든 후 소스 .zip 파일을 업로드하지 않았으므로 파이프라인이 실패할 수도 있습니다. 소스 파일을 준비한 후에 .zip 파일을 업로드합니다.
AWS CLI 사용
cp-template.yaml에 사용한 것과 동일한 파일 경로를 사용하고 다음 create-stack AWS CLI 명령을 실행합니다.
aws cloudformation create-stack \ --stack-name stack-name \ --capabilities CAPABILITY_NAMED_IAM \ --template-body file://cp-template.yaml \ --parameters ParameterKey=TargetRegions,ParameterValue=aa-example-1\\,aa-example-2
참고: stack-name을 스택 이름으로, //./cp-template.yaml을 파일 경로로, aa-example-1 및 aa-example-2를 리전으로 바꾸십시오.
Amazon S3 버킷에 소스 파일 업로드
소스 파일 준비
배포 대상을 정의하려면 .txt 파일을 만들고 이름을 ou.txt로 지정합니다. .txt 파일에 다음 코드를 추가합니다.
["ou-xrop-xxxxxxxx","ou-xrop-yyyyyyyy"]
CloudFormation 템플릿 파라미터를 정의하려면 .txt 파일을 만들고 이름을 parameters.txt로 지정합니다. .txt 파일에 다음 코드를 추가합니다.
[ { "ParameterKey": "VersioningStatus", "ParameterValue": "Enabled" } ]
StackSet 템플릿을 만들려면 .txt 파일을 만들고 이름을 template.yaml로 지정합니다. .txt 파일에 다음 코드를 추가합니다.
AWSTemplateFormatVersion: 2010-09-09 Parameters: VersioningStatus: Type: String Default: Suspended AllowedValues: - Enabled - Suspended Resources: S3Bucket: Type: 'AWS::S3::Bucket' DeletionPolicy: Delete Properties: VersioningConfiguration: Status: !Ref VersioningStatus
소스 파일 배포
세 파일을 source.zip으로 압축한 다음, .zip 파일을 소스 Amazon Simple Storage Service(Amazon S3) 버킷의 루트 디렉터리에 업로드합니다. 파이프라인이 실패하여 "Account used is not a delegated administrator" 오류가 발생하면 계정을 위임된 관리자로 등록했는지 확인하십시오.
관련 정보
AWS CloudFormation StackSets 배포 작업 참조
ListStackSets 작업을 실행할 때 오류를 해결하려면 어떻게 해야 합니까?"Account used is not a delegated administrator"
- 언어
- 한국어
