検索
連載

テンプレート作成が簡単 CloudFormationの入門にもおすすめなInfrastructure Composerを使ってみようAWSチートシート

AWSのインフラをコードで構成できるCloudFormation。そのテンプレートをグラフィカルインタフェースで容易に作成できる、Infrastructure Composerの使い方を説明します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

 「Amazon Web Services」(AWS)活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、「AWS Infrastructure Composer(Infrastructure Composer)」を使って「AWS CloudFormation(CloudFormation)」のテンプレートを作成する方法をご紹介します。

 Infrastructure Composerは、2024年の10月まで「AWS Application Composer (Application Composer)」と呼ばれていたサービスです。

 元々Application Composerは、2022年の「AWS re:Invent」で公開されたサービスで、サーバレスアプリケーションのリソース構築を迅速化するために登場しました。これが、より広範なインフラの構築に対応する形で生まれ変わったのが Infrastructure Composerです。

Application Composerが登場した背景

 CloudFormationでは、「テンプレート」と呼ばれるコードを定義することで 、AWSリソースの構築や管理を行うことができます。

 このテンプレートは再利用が可能で、設定内容を変更したり、CI/CDパイプラインによる自動デプロイができたりといった、大きなメリットがあります。その一方で、テンプレートを記載するためのYAMLやJSONのコードは何百行を超えるほど膨大になることがあり、多くのユーザーが苦労を抱えている点でもあります。

 このテンプレートをより簡単に書く方法として、Application Composerが生まれました。ユーザーはシンプルなドラッグ&ドロップ操作によってテンプレートを作成することができます。

 Application ComposerからInfrastructure Composerに名前が変わってからも、ドラッグ&ドロップで簡単にテンプレートを作成できる利点は変わっていません。今回はInfrastructure Composerの使い方について確認していきましょう。

Infrastructure Composerを使ってみよう

 それでは、実際にInfrastructure Composerを使っていきます。

ステップ1 プロジェクトの作成

 AWSマネジメントコンソールから「Infrastructure Composer」と検索して遷移すると、サービスのホーム画面が表示されます。ここで「プロジェクトの作成」をクリックします。


図1 Infrastructure Composerのホーム画面

 プロジェクト作成ページは、ドラッグ&ドロップでインフラリソースを描いていくことのできる「キャンバス」部分(画面中央から右側)と、作成するリソースを選択できる「リソース」部分(画面左側)に分かれています。


図2 Infrastructure Composerのプロジェクト作成ページ

ステップ2 S3バケットの作成

 次に、リソースの一覧から「S3バケット」を探して、キャンバスへドラッグ&ドロップしてみましょう。

 すると、下のようにカード形式でS3バケットのリソースが表示されます。


図3 S3バケットをキャンバスへドラッグ&ドロップ

 追加されたS3バケットのカードをクリックすると、「詳細」というボタンが表示されるので、こちらをクリックしてみましょう。

 すると、リソースのプロパティとして、論理IDや幾つかの設定項目が表示されます。今回は初期値で進めていきますが、要件に応じて自由に編集を行うことが可能です。


図4 作成したS3バケットのプロパティ

 それでは、表示されているS3リソースのテンプレートを見てみましょう。

 「キャンバス」が選択されているところを「テンプレート」に切り替えると、現時点で生成されたS3バケットのテンプレートコードが表示されます。


図5 生成されたS3バケットのYAMLテンプレート

 テンプレートを見ると、この時点で既に30行のコードが記載されています。全てを一から正確に記載することを考えると、これだけでもとても便利なことが実感できます。

 また、テンプレートの内容については、自動生成されたものを自身の用途に合わせて修正し、利用することができます。

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${AWS::StackName}-bucket-${AWS::AccountId}
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: aws:kms
              KMSMasterKeyID: alias/aws/s3
      PublicAccessBlockConfiguration:
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  BucketBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument:
        Id: RequireEncryptionInTransit
        Version: '2012-10-17'
        Statement:
          - Principal: '*'
            Action: '*'
            Effect: Deny
            Resource:
              - !GetAtt Bucket.Arn
              - !Sub ${Bucket.Arn}/*
            Condition:
              Bool:
                aws:SecureTransport: 'false'
Transform: AWS::Serverless-2016-10-31

ステップ3 Lambda関数の作成

 S3バケットの他にもリソースを追加してみましょう。

 画面左側のリソースから、今度はLambda関数を探して、キャンバスへのドラッグ&ドロップを行います。


図6 Lambda関数をキャンバス内に作成

 作成したLambda関数のプロパティは、「詳細」ボタンをクリックすることで確認できます。

 今回は設定内容の変更を特に行わずに進めていきますが、実際に構築まで行う場合は、ランタイムで使用する言語や割り当てるメモリの量などを変更して、利用することが可能です。


図7: 作成した Lambda関数のプロパティ

 それでは、キャンバスのエリアに表示されているS3バケットとLambda関数のカードを見てみましょう。今度は小さな円が表示されます。

 この円をクリックして、S3バケットとLambda関数をひも付ければ、Lambda関数の実行イベントとしてS3バケットを結び付けることができます。


図8 キャンバス内のS3バケットとLambda関数をひも付ける

 この時、実際に作成されたテンプレートを見てみると、Lambda関数の実行イベントとして 、S3バケット内にオブジェクトが作成あるいは削除されたことを表す「s3:ObjectCreated:*」「s3:ObjectRemoved:*」が指定されていることを確認できます。


図9 Lambda関数テンプレートのLambda実行イベント

 ここまでのステップでInfrastructure Composerによって生成されたテンプレートはこちらです。

 画面上では少しの操作しかしていませんが、かなりの量のコードを生成してくれていることが分かりますね。

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${AWS::StackName}-bucket-${AWS::AccountId}
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: aws:kms
              KMSMasterKeyID: alias/aws/s3
      PublicAccessBlockConfiguration:
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  BucketBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument:
        Id: RequireEncryptionInTransit
        Version: '2012-10-17'
        Statement:
          - Principal: '*'
            Action: '*'
            Effect: Deny
            Resource:
              - !GetAtt Bucket.Arn
              - !Sub ${Bucket.Arn}/*
            Condition:
              Bool:
                aws:SecureTransport: 'false'
  Function:
    Type: AWS::Serverless::Function
    Properties:
      Description: !Sub
        - Stack ${AWS::StackName} Function ${ResourceName}
        - ResourceName: Function
      CodeUri: src/Function
      Handler: index.handler
      Runtime: nodejs20.x
      MemorySize: 3008
      Timeout: 30
      Tracing: Active
      Events:
        Bucket:
          Type: S3
          Properties:
            Bucket: !Ref Bucket
            Events:
              - s3:ObjectCreated:*
              - s3:ObjectRemoved:*
  FunctionLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: !Sub /aws/lambda/${Function}
Transform: AWS::Serverless-2016-10-31

ステップ4 DynamoDBテーブルの作成

 それでは最後に、DynamoDBテーブルを作成してみましょう。

 これまでと同様の手順でDynamoDBテーブルをキャンバスへドラッグ&ドロップし、今度はLambda関数のカードとのひも付けを行います。


図10 DynamoDBテーブルを作成してLambda関数とひも付ける

 この際、Lambda関数のプロパティを確認してみると、DynamoDBテーブルへのアクセスを許可するためのIAMポリシーが追加されていることが確認できます。


図11 Lambda関数からDynamoDBテーブルへのアクセス許可

 ここまでの時点で生成されたテンプレートコードは以下になります。

 Lambda関数のアクセス許可の部分など、今回のステップで追加された部分を確認してみてください。

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${AWS::StackName}-bucket-${AWS::AccountId}
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: aws:kms
              KMSMasterKeyID: alias/aws/s3
      PublicAccessBlockConfiguration:
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
  BucketBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument:
        Id: RequireEncryptionInTransit
        Version: '2012-10-17'
        Statement:
          - Principal: '*'
            Action: '*'
            Effect: Deny
            Resource:
              - !GetAtt Bucket.Arn
              - !Sub ${Bucket.Arn}/*
            Condition:
              Bool:
                aws:SecureTransport: 'false'
  Function:
    Type: AWS::Serverless::Function
    Properties:
      Description: !Sub
        - Stack ${AWS::StackName} Function ${ResourceName}
        - ResourceName: Function
      CodeUri: src/Function
      Handler: index.handler
      Runtime: nodejs20.x
      MemorySize: 3008
      Timeout: 30
      Tracing: Active
      Events:
        Bucket:
          Type: S3
          Properties:
            Bucket: !Ref Bucket
            Events:
              - s3:ObjectCreated:*
              - s3:ObjectRemoved:*
      Environment:
        Variables:
          TABLE_TABLE_NAME: !Ref Table
          TABLE_TABLE_ARN: !GetAtt Table.Arn
      Policies:
        - DynamoDBCrudPolicy:
            TableName: !Ref Table
  FunctionLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: !Sub /aws/lambda/${Function}
  Table:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      BillingMode: PAY_PER_REQUEST
      KeySchema:
        - AttributeName: id
          KeyType: HASH
      StreamSpecification:
        StreamViewType: NEW_AND_OLD_IMAGES
Transform: AWS::Serverless-2016-10-31

ステップ5  テンプレートファイルの保存

 作成したテンプレートファイルは、クリップボードにコピーして利用することもできますし、ローカルに保存することも可能です。

 ローカルに保存する場合は、「メニュー」から「テンプレートファイルを保存」と選択してください。


図12 テンプレートファイルの保存

 その他にも、キャンバス上での編集内容をローカルファイルに同期したり、キャンバス上に作成したアーキテクチャ図をPNGファイルとしてエクスポートしたりすることもできるので、適宜活用してみてください。

終わりに

 今回は、Infrastructure Composerの使い方について紹介しました。

 以前からCloudFormationを利用されている方はもちろん、テンプレートを書いたことがないという方でもリソースを容易に構築することができるので、これを機に CloudFormationの利用を進めてみてはいかがでしょうか?

 テンプレートコードを見て気になった部分や、分からない部分があれば、ドキュメントを探して、テンプレートの書き方も確認してみてくださいね。

筆者紹介

天野 盛介

株式会社システムシェアード所属。

マルチクラウドへの閉域接続サービスのサービスマネジメント業務、AWSの基盤構築支援などを経験し、東京ITスクールにてAWS研修コンテンツの開発や登壇に従事。

検証・学習用にAWSを完全定額で利用できるサービス「安心サンドボックス」の提供や、AWSが提供する公式eラーニングサービス「AWS Skill Builder」を利用したAWSの技術習得支援を行う。

著書『AWSを好きになる本 ゼロから始めるクラウドジャーニー』(インプレスR&D)2021


Copyright © ITmedia, Inc. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る