AWS CloudFormation의 Amazon S3 버킷에서 사용자 지정 리소스를 사용하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 19일

S3 버킷을 만든 후 표준 작업을 수행할 수 있도록 AWS CloudFormation의 Amazon Simple Storage Service(Amazon S3) 버킷에서 사용자 지정 리소스를 사용하고 싶습니다.

간략한 설명

다음 문제 해결의 AWS CloudFormation 템플릿을 사용하여 AWS CloudFormation의 S3 버킷에서 사용자 지정 리소스를 사용할 수 있습니다.

다음 사항을 고려하십시오.

  • 템플릿을 사용하면 S3 버킷에 폴더를 만들 수 있습니다. Amazon S3는 구조가 평평하지만 객체를 그룹화하는 수단으로 폴더 개념을 지원합니다.
  • 이 템플릿을 사용하여 S3 버킷을 생성한 후 콘텐츠 복사, 콘텐츠 업로드, 서로 다른 두 버킷 동기화 등의 작업을 수행할 수 있습니다.
  • 사용자 코드로 템플릿을 수정할 수 있습니다.
  • 이 템플릿은 AWS Lambda 지원 사용자 지정 리소스를 사용하며, 사용자가 Lambda 모범 사례문제 해결에 익숙하다고 가정합니다.

참고: 다음 해결 방법에서는 AWS CloudFormation 스택이 삭제되면 모든 S3 버킷 콘텐츠가 삭제됩니다. Lambda 코드를 수정하여 이 동작을 수정할 수 있습니다.

​해결 방법

AWS CloudFormation 템플릿 가져오기

AWS CloudFormation을 사용하여 S3 버킷에 폴더를 생성하려면 다음 AWS CloudFormation 템플릿을 YAML 파일로 저장합니다.

Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

AWSTemplateFormatVersion: 2010-09-09
Description: Working with custom resources and S3
Parameters:
  S3BucketName:
    Type: String
    Description: "S3 bucket to create."
    AllowedPattern: "[a-zA-Z][a-zA-Z0-9_-]*"
  DirsToCreate:
    Description: "Comma delimited list of directories to create."
    Type: CommaDelimitedList
Resources:
  SampleS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref S3BucketName
  S3CustomResource:
    Type: Custom::S3CustomResource
    Properties:
      ServiceToken: !GetAtt AWSLambdaFunction.Arn
      the_bucket: !Ref SampleS3Bucket
      dirs_to_create: !Ref DirsToCreate
  AWSLambdaFunction:
     Type: "AWS::Lambda::Function"
     Properties:
       Description: "Work with S3 Buckets!"
       FunctionName: !Sub '${AWS::StackName}-${AWS::Region}-lambda'
       Handler: index.handler
       Role: !GetAtt AWSLambdaExecutionRole.Arn
       Timeout: 360
       Runtime: python3.6
       Code:
         ZipFile: |
          import boto3
          import cfnresponse
          def handler(event, context):
              # Init ...
              the_event = event['RequestType']
              print("The event is: ", str(the_event))
              response_data = {}
              s_3 = boto3.client('s3')
              # Retrieve parameters
              the_bucket = event['ResourceProperties']['the_bucket']
              dirs_to_create = event['ResourceProperties']['dirs_to_create']
              try:
                  if the_event in ('Create', 'Update'):
                      print("Requested folders: ", str(dirs_to_create))
                      for dir_name in dirs_to_create:
                          print("Creating: ", str(dir_name))
                          s_3.put_object(Bucket=the_bucket,
                                         Key=(dir_name
                                              + '/'))
                  elif the_event == 'Delete':
                      print("Deleting S3 content...")
                      b_operator = boto3.resource('s3')
                      b_operator.Bucket(str(the_bucket)).objects.all().delete()
                  # Everything OK... send the signal back
                  print("Execution succesfull!")
                  cfnresponse.send(event,
                                   context,
                                   cfnresponse.SUCCESS,
                                   response_data)
              except Exception as e:
                  print("Execution failed...")
                  print(str(e))
                  response_data['Data'] = str(e)
                  cfnresponse.send(event,
                                   context,
                                   cfnresponse.FAILED,
                                   response_data)
  AWSLambdaExecutionRole:
     Type: AWS::IAM::Role
     Properties:
       AssumeRolePolicyDocument:
         Statement:
         - Action:
           - sts:AssumeRole
           Effect: Allow
           Principal:
             Service:
             - lambda.amazonaws.com
         Version: '2012-10-17'
       Path: "/"
       Policies:
       - PolicyDocument:
           Statement:
           - Action:
             - logs:CreateLogGroup
             - logs:CreateLogStream
             - logs:PutLogEvents
             Effect: Allow
             Resource: arn:aws:logs:*:*:*
           Version: '2012-10-17'
         PolicyName: !Sub ${AWS::StackName}-${AWS::Region}-AWSLambda-CW
       - PolicyDocument:
           Statement:
           - Action:
             - s3:PutObject
             - s3:DeleteObject
             - s3:List*
             Effect: Allow
             Resource:
             - !Sub arn:aws:s3:::${SampleS3Bucket}/*
             - !Sub arn:aws:s3:::${SampleS3Bucket}
           Version: '2012-10-17'
         PolicyName: !Sub ${AWS::StackName}-${AWS::Region}-AWSLambda-S3
       RoleName: !Sub ${AWS::StackName}-${AWS::Region}-AWSLambdaExecutionRole

AWS CloudFormation 템플릿 배포

AWS CloudFormation 콘솔 또는 AWS 명령줄 인터페이스(AWS CLI)를 사용하여 AWS CloudFormation 템플릿을 배포할 수 있습니다.

AWS CloudFormation 콘솔 사용:

1.    AWS CloudFormation 콘솔을 엽니다.

2.    [스택 만들기(Create stack)]를 선택한 다음 [새 리소스 사용 (표준)(With new resources (standard)]을 선택합니다.

3.    [템플릿 지정(Specify template)] 섹션에서 [템플릿 파일 업로드(Upload a template file)]를 선택합니다.

4.    [파일 선택(Choose file)]을 선택하고 1단계에서 다운로드한 템플릿을 선택한 후 [다음(Next)]을 선택합니다.

5.    [파라미터(Parameters)] 섹션에서 [S3BucketName]에 대해 S3 버킷을 선택합니다.

6.    [DirsToCreate]에 만들려는 폴더 및 하위 폴더의 쉼표로 구분된 목록을 입력합니다.

참고: 예를 들어, dir_1, dir_2/sub_dir_2, dir_3을 목록으로 입력할 수 있습니다.

7.    설정 마법사의 나머지 단계를 완료한 다음, [스택 생성(Create stack)]을 선택합니다.

AWS CLI 사용:

1.    다운로드한 템플릿 custom-resource-lmabda-s3.yaml 이름을 지정합니다.

2.    AWS CLI를 설치합니다.

3.    운영 체제에서 명령 줄을 열고 템플릿이 있는 폴더로 이동합니다.

4.    다음 명령을 실행합니다.

aws cloudformation create-stack \
                   --timeout-in-minutes 10 \
                   --disable-rollback \
                   --stack-name testing-custom-resource-s3 \
                   --template-body file://custom-resource-lmabda-s3.yaml \
                   --capabilities CAPABILITY_NAMED_IAM \
                   --parameters \
                   ParameterKey=DirsToCreate,ParameterValue="dir_1\,dir_2/sub_dir_2\,dir_3" \
                   ParameterKey=S3BucketName,ParameterValue="test-bucket-custom-resource"

노드: 해당 값을 사용하여 [파라미터(parameters)]를 업데이트합니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?