AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

AWS CDK 부트스트랩을 사용자 지정하고 CFNToolkit CloudFormation 스택을 배포하려면 어떻게 해야 합니까?

4분 분량
0

AWS Cloud Development Kit(AWS CDK) 부트스트랩을 사용자 지정하고 CFN AWS CloudFormation 스택을 배포하려고 합니다.

간략한 설명

AWS CDK를 사용하려면 AWS 계정을 부트스트랩해야 합니다. 부트스트랩 작업은 AWS CDK에 필요한 리소스를 계정에 생성합니다. 다음 작업을 통해 규정 준수 및 보안 요구 사항을 충족하도록 부트스트랩 템플릿을 사용자 지정할 수 있습니다.

  • 리소스에 태그를 추가합니다.
  • Amazon Simple Storage Service (Amazon S3) 버킷에 대한 암호화를 추가합니다.
  • 사용자 지정 S3 버킷 이름을 사용합니다.
  • 기존 S3 버킷을 사용하거나 부트스트랩 템플릿에서 생성한 AWS Identity and Access Management(IAM) 역할에 최소 권한 보안 주체를 적용합니다.

cdk bootstrap 명령은 CDKToolkit이라는 이름의 CloudFormation 스택을 생성합니다. CDKToolkit CloudFormation 스택에 배포된 리소스는 템플릿에서 제공됩니다.

부트스트랩 템플릿을 표시하려면 다음 명령을 실행합니다.

cdk bootstrap --show-template > bootstrap-template.yml

위의 부트스트랩 템플릿에는 다음과 같은 리소스가 있습니다.

  • S3 버킷과 같은 리소스
  • AWS Key Management Service(AWS KMS) 키
  • IAM 역할
  • 버전 관리를 위한 SSM 파라미터

자세한 내용은 GitHub 웹 사이트에서 ](https://gist.github.com/cagingulsen/e180ed4b10cc5baf3b636d6c42c1cb34)사용자 지정 부트스트래핑을 위한 AWS CDK 부트스트랩 템플릿[을 참조하십시오.

다음과 같이 사용 사례에 맞게 부트스트랩 템플릿을 사용자 지정할 수 있습니다.

  • AWS CDK를 사용하여 실제로 사용하는 리소스만 배포할 수 있습니다.
  • AWS CDK 앱 파일 자산을 저장하기 위한 S3 버킷의 사용자 지정 한정자와 이름을 업데이트하거나 생성합니다.
  • 기존 S3 버킷을 사용하여 AWS CDK 앱 파일 자산을 보관합니다.

해결 방법

부트스트랩 템플릿을 사용자 지정하려면 다음 방법 중 하나를 사용합니다.

AWS CDK를 사용하여 실제로 사용하는 리소스만 배포

AWS CDK 부트스트랩은 CloudFormation이 스택을 배포할 때 맡는 역할인 CloudFormationExecutionRole을 생성합니다. 그런 다음 CloudFormation은 이 역할을 사용하여 cdk deploy 명령으로 로컬 머신에서 배포하거나 CI/CD용 AWS CDK Pipelines를 통해 배포합니다.

AWS CDK로 리소스를 생성할 수 있도록 하기 위해 CloudFormationExecutionRole에는 모든 작업을 수행할 수 있는 전체 액세스 권한을 부여하는 arn:aws:iam:aws:policy/AdministratorAccess 정책이 있습니다. 참고로 이 정책은 최소 권한 원칙에 위배됩니다. 이 정책을 제한하려면 새 정책을 생성한 다음 새 사용자 지정 정책으로 AWS CDK를 부트스트래핑해야 합니다.

참고: 모든 명령을 검토하고 모든 example 문자열을 필요한 값으로 바꾸십시오.

  1. IAM에서 사용자 지정 정책 생성:

    aws iam create-policy \
      --policy-name cdkCFExecutionPolicy \
      --policy-document file://example-custom-Execution-Policy-name.json
  2. 새로 생성된 IAM 정책을 사용하여 AWS CDK를 부트스트래핑:

    ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
    cdk bootstrap aws://$ACCOUNT_ID/example-Region \
      --cloudformation-execution-policies "arn:aws:iam::$ACCOUNT_ID:policy/example-custom-Execution-Policy-name"
  3. (선택 사항) 계정이 이미 부트스트래핑된 경우 새 사용자 지정 정책으로 cdk bootstrap 명령을 다시 실행합니다.

  4. (선택 사항) AWS CDK 애플리케이션에 필요한 대로 정책을 업데이트하고 새 정책 버전을 생성합니다. 새 정책 버전을 기본 정책으로 설정할 수 있습니다.

참고: IAM에는 5개의 정책 버전만 저장할 수 있습니다. 정책을 업데이트하는 경우 필요에 따라 이전 버전을 삭제하십시오.

AWS CDK 앱 파일 자산을 저장하기 위한 S3 버킷의 사용자 지정 한정자와 이름을 업데이트하거나 생성

  1. 한정자 및 bootstrap-bucket-name에 대한 추가 플래그를 전달하여 계정을 부트스트래핑합니다. 이러한 플래그는 리소스에 대한 새 값으로 CDKToolkit CloudFormation 스택을 생성하거나 업데이트합니다.

    cdk bootstrap --template bootstrap-template.yml --qualifier <example-custom-qualifier-value> --bootstrap-bucket-name <example-custom-bucket-name> --profile <example-profile-name>
  2. 다음 값으로 app.py 파일을 업데이트합니다.

    import os
    import aws_cdk as cdk
    from myproject.myproject_stack import MyprojectStack
    app = cdk.App()
    MyprojectStack(app, "MyprojectStack", synthesizer=cdk.DefaultStackSynthesizer(qualifier="<example-custom-qualifier-value>", file_assets_bucket_name="<example-custom-bucket-name>"))
    app.synth()

참고: 이미 존재하는 리소스로 인해 CDKToolkit 스택이 배포되지 않는 경우 먼저 리소스를 찾고 필요하지 않은 경우 삭제하십시오. 그런 다음 CloudFormation 스택에서 부트스트래핑을 다시 수행합니다.

기존 S3 버킷을 사용하여 AWS CDK 앱 파일 자산 보관

AWS CDK 애플리케이션은 CDKToolkit AWS CloudFormation 스택 > 출력 섹션의 S3 버킷 이름과 위치를 사용합니다. 기존 S3 버킷을 사용하려면 bootstrap-template.yml을 수정해야 합니다.

  1. 기존 S3 버킷 세부 정보를 사용하여 BucketNameBucketDomainNameOutputs 값을 수정합니다.

    Outputs:
        BucketName:
            Description: The name of S3 bucket owned by the CDK toolkit stack
            Value: <example-existing-bucket-name>
        BucketDomainName:
            Description: The domain name of the S3 bucket owned by the CDK toolkit stack
            Value: <example-existing-bucket-name>.s3.<example-Region>.amazonaws.com
  2. bootstrap-template.ymlDeploymentActionRoleFilePublishingRoleDefaultPolicy 리소스에 기존 S3 버킷의 ARN을 추가합니다.

    Resources:
        DeploymentActionRole:
            Type: AWS::IAM::Role
            Properties:
              AssumeRolePolicyDocument:
                Statement:
                  - Action: sts:AssumeRole
                    Effect: Allow
                    Principal:
                      AWS:
                        Ref: AWS::AccountId
                  - Fn::If:
                      - HasTrustedAccounts
                      - Action: sts:AssumeRole
                        Effect: Allow
                        Principal:
                          AWS:
                            Ref: TrustedAccounts
                      - Ref: AWS::NoValue
              Policies:
                - PolicyDocument:
                    Statement:
                      - Sid: CliStagingBucket
                        Effect: Allow
                        Action:
                          - s3:GetObject*
                          - s3:GetBucket*
                          - s3:List*
                        Resource:
                          - Fn::Sub: ${StagingBucket.Arn}
                          - Fn::Sub: ${StagingBucket.Arn}/*
                          - arn:aws:s3:::<example-existing-bucket-name>
                          - arn:aws:s3:::<example-existing-bucket-name>/
                    Version: "example-version"
                  PolicyName: default
              RoleName:
                Fn::Sub: cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}
              Tags:
                - Key: aws-cdk:bootstrap-role
                  Value: deploy
        FilePublishingRoleDefaultPolicy:
            Type: AWS::IAM::Policy
            Properties:
              PolicyDocument:
                Statement:
                  - Action:
                      - s3:GetObject*
                      - s3:GetBucket*
                      - s3:GetEncryptionConfiguration
                      - s3:List*
                      - s3:DeleteObject*
                      - s3:PutObject*
                      - s3:Abort*
                    Resource:
                      - Fn::Sub: ${StagingBucket.Arn}
                      - Fn::Sub: ${StagingBucket.Arn}/*
                      - arn:aws:s3:::<example-existing-bucket-name>/
                      - arn:aws:s3:::<example-existing-bucket-name>
                    Effect: Allow
                  - Action:
                      - kms:Decrypt
                      - kms:DescribeKey
                      - kms:Encrypt
                      - kms:ReEncrypt*
                      - kms:GenerateDataKey*
                    Effect: Allow
                    Resource:
                      Fn::If:
                        - CreateNewKey
                        - Fn::Sub: ${FileAssetsBucketEncryptionKey.Arn}
                        - Fn::Sub: arn:${AWS::Partition}:kms:${AWS::Region}:${AWS::AccountId}:key/${FileAssetsBucketKmsKeyId}
                Version: "example-version"
              Roles:
                - Ref: FilePublishingRole
              PolicyName:
                Fn::Sub: cdk-${Qualifier}-file-publishing-role-default-policy-${AWS::AccountId}-${AWS::Region}
  3. cdk bootstrap 명령을 실행합니다. CDKToolkit CloudFormation 스택은 이전 변경 사항을 사용하여 생성되거나 업데이트됩니다.

  4. 프로젝트 내 기존 S3 버킷에 파일 자산을 업로드하려면 CDK용 스택 합성기를 편집합니다. app.py 파일에 다음을 포함시킵니다.

    MyprojectStack(app, "MyprojectStack", synthesizer=cdk.DefaultStackSynthesizer(file_assets_bucket_name="<example-existing-bucket-name>"))

참고: 추가 파라미터를 구성하고 사용자 정의할 수 있습니다. 자세한 내용은 부트스트래핑 사용자 지정을 참조하십시오.

AWS 공식
AWS 공식업데이트됨 6달 전