テンプレート作成が簡単 CloudFormationの入門にもおすすめなInfrastructure Composerを使ってみよう:AWSチートシート
AWSのインフラをコードで構成できるCloudFormation。そのテンプレートをグラフィカルインタフェースで容易に作成できる、Infrastructure Composerの使い方を説明します。
「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」と検索して遷移すると、サービスのホーム画面が表示されます。ここで「プロジェクトの作成」をクリックします。
プロジェクト作成ページは、ドラッグ&ドロップでインフラリソースを描いていくことのできる「キャンバス」部分(画面中央から右側)と、作成するリソースを選択できる「リソース」部分(画面左側)に分かれています。
ステップ2 S3バケットの作成
次に、リソースの一覧から「S3バケット」を探して、キャンバスへドラッグ&ドロップしてみましょう。
すると、下のようにカード形式でS3バケットのリソースが表示されます。
追加されたS3バケットのカードをクリックすると、「詳細」というボタンが表示されるので、こちらをクリックしてみましょう。
すると、リソースのプロパティとして、論理IDや幾つかの設定項目が表示されます。今回は初期値で進めていきますが、要件に応じて自由に編集を行うことが可能です。
それでは、表示されているS3リソースのテンプレートを見てみましょう。
「キャンバス」が選択されているところを「テンプレート」に切り替えると、現時点で生成されたS3バケットのテンプレートコードが表示されます。
テンプレートを見ると、この時点で既に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関数を探して、キャンバスへのドラッグ&ドロップを行います。
作成したLambda関数のプロパティは、「詳細」ボタンをクリックすることで確認できます。
今回は設定内容の変更を特に行わずに進めていきますが、実際に構築まで行う場合は、ランタイムで使用する言語や割り当てるメモリの量などを変更して、利用することが可能です。
それでは、キャンバスのエリアに表示されているS3バケットとLambda関数のカードを見てみましょう。今度は小さな円が表示されます。
この円をクリックして、S3バケットとLambda関数をひも付ければ、Lambda関数の実行イベントとしてS3バケットを結び付けることができます。
この時、実際に作成されたテンプレートを見てみると、Lambda関数の実行イベントとして 、S3バケット内にオブジェクトが作成あるいは削除されたことを表す「s3:ObjectCreated:*」「s3:ObjectRemoved:*」が指定されていることを確認できます。
ここまでのステップで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関数のカードとのひも付けを行います。
この際、Lambda関数のプロパティを確認してみると、DynamoDBテーブルへのアクセスを許可するためのIAMポリシーが追加されていることが確認できます。
ここまでの時点で生成されたテンプレートコードは以下になります。
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 テンプレートファイルの保存
作成したテンプレートファイルは、クリップボードにコピーして利用することもできますし、ローカルに保存することも可能です。
ローカルに保存する場合は、「メニュー」から「テンプレートファイルを保存」と選択してください。
その他にも、キャンバス上での編集内容をローカルファイルに同期したり、キャンバス上に作成したアーキテクチャ図を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.