AWS CloudFormation リソースのインポートを使用して、既存の S3 バケットで AWS Lambda の Amazon S3 通知設定を作成するにはどうすればよいですか?

最終更新日: 2020 年 10 月 7 日

AWS CloudFormation を使用してリソースをインポートして、既存の S3 バケットに AWS Lambda の Amazon Simple Storage Service (Amazon S3) 通知設定を作成したいと考えています。

簡単な説明

カスタムリソースを使用せずに Amazon S3 通知を設定するには、次の操作を行います。
  1. Lambda 関数 S3NotificationLambdaFunction を使用してテンプレートを作成します。これにより、既存のバケット NotificationS3Bucket 通知設定が追加されます。
  2. リソースのインポートを使用して、(作成したテンプレートで指定された) 既存の S3 バケット NotificationS3Bucket を AWS CloudFormation 管理に取り込みます。
  3. AWS CloudFormation スタックを更新して、S3 バケットで有効にするプロパティを含めます。

カスタムリソースを使用するには、AWS CloudFormation を使用して、既存の S3 バケットに Lambda の Amazon S3 通知設定を作成する方法を教えてくださいを参照してください。

解決方法

重要: 次の手順は、S3 バケット内の既存の通知設定または手動で作成された通知設定を上書きします。次の手順に従って、インポートされた S3 バケットに新しい通知設定を追加できます。

Lambda 関数を使用して AWS CloudFormation テンプレートを作成する

次のサンプルテンプレートは、実行ロールと関数を呼び出すアクセス許可を持つ Lambda 関数を作成します。既存の Lambda 関数を使用するには、S3 バケットの LambdaConfiguration プロパティの AWS CloudFormation テンプレートで Lambda 関数 Amazon リソースネーム (ARN) を使用します。

AWSTemplateFormatVersion: 2010-09-09
Description: >-
  Sample template that shows you how to import an existing S3 bucket as an event source for a Lambda function
Parameters:
  NotificationBucket:
    Type: String
    Description: S3 bucket which is used for Lambda event notification
Resources:
  S3NotificationLambdaFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Code:
        ZipFile: !Join
          - |+

          - - import json
            - 'def lambda_handler(event,context):'
            - '    return ''Welcome... This is a test Lambda Function'''
      Handler: index.lambda_handler
      Role: !GetAtt LambdaIAMRole.Arn
      Runtime: python3.6
      Timeout: 5
  LambdaInvokePermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      FunctionName: !GetAtt S3NotificationLambdaFunction.Arn
      Action: 'lambda:InvokeFunction'
      Principal: s3.amazonaws.com
      SourceAccount: !Ref 'AWS::AccountId'
      SourceArn: !Sub 'arn:aws:s3:::${NotificationBucket}'
  LambdaIAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - 's3:GetBucketNotification'
                  - 's3:PutBucketNotification'
                Resource: !Sub 'arn:aws:s3:::${NotificationBucket}'
              - Effect: Allow
                Action:
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                  - 'logs:PutLogEvents'
                Resource: 'arn:aws:logs:*:*:*'

既存の S3 バケットを AWS CloudFormation スタックにインポートする

1.    AWS CloudFormation コンソールを開きます。

2.    ナビゲーションペインで [Stack] (スタック) を選択し、作成しておいたスタックを選択します。

3.    [Stack actions] (スタックアクション) を選択し、[Import resources into stack] (スタックへのリソースのインポート) を選択します。

4.    [Import overview] (概要をインポート) ページを確認し、[Next] (次へ) を選択します。

重要: AWS CloudFormation テンプレートでは、インポートする各リソースに DeletionPolicy 属性があり、他のすべてのリソースは同じままである必要があります。例:

AWSTemplateFormatVersion: 2010-09-09
Description: >-
  Sample template that shows you how to import an existing S3 bucket as an event source for a Lambda function
Parameters:
  NotificationBucket:
    Type: String
    Description: S3 bucket which is used for Lambda event notification
Resources:
  S3NotificationLambdaFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      .
      .
  LambdaInvokePermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      .
      .
  LambdaIAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      .
      .

  <The preceding resources were already created. Now, add the DeletionPolicy to the preceding stack to import the S3 bucket.>
  NotificationS3Bucket:
    Type: 'AWS::S3::Bucket'
    DeletionPolicy: Retain            
    Properties:
      BucketName: myenv-bucket          #Bucket name to import

5.    [Specify template (テンプレートの指定)] セクションで、[Amazon S3 URL] または要件に基づいて [Upload a template file (テンプレートファイルのアップロード)] を選択し、[Next (次へ)] を選択します。

6.    ウィザードの残りの手順を実行して、既存のリソースをインポートします。詳細については、「AWS CloudFormation コンソールを使用した既存のリソースのスタックへのインポート」を参照してください。

7.    スタックが IMPORT_COMPLETE 状態になるまで待ちます。

AWS CloudFormation テンプレートを更新する

1.    前に変更した AWS CloudFormation テンプレートを使用してスタックを更新します。

2.    スタックが UPDATE_COMPLETE 状態になるまで待ち、S3 バケットの NotificationConfiguration を確認します。

3.    S3 バケット (以下の例では myenv-bucket) で Amazon S3 イベント通知を有効にします。例:

AWSTemplateFormatVersion: 2010-09-09
Description: >-
  Sample template that shows you how to import an existing S3 bucket as an event source for a Lambda function
Parameters:
  NotificationBucket:
    Type: String
    Description: S3 bucket which is used for Lambda event notification
Resources:
  S3NotificationLambdaFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      .
      .
  LambdaInvokePermission:
    Type: 'AWS::Lambda::Permission'
    Properties:
      .
      .
  LambdaIAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      .
      .

  <The preceding resources were already created. Now, add the DeletionPolicy to the preceding stack to import the S3 bucket.>
  NotificationS3Bucket:
    Type: 'AWS::S3::Bucket'
    DeletionPolicy: Retain            
    Properties:
      BucketName: myenv-bucket          
      NotificationConfiguration:   #Update stack with NotificationConfiguration
          LambdaConfigurations:
              - Event: 's3:ObjectCreated:Put'
                Function: !GetAtt S3NotificationLambdaFunction.Arn
              - Event: 's3:ObjectRemoved:*'
                Function: !GetAtt S3NotificationLambdaFunction.Arn

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?