Posts

ECSでタスク停止しても復活する理由と本番環境ではやっていけないDBメンテナンス

  • POSTS
1. 何が起きたか Amazon Aurora PostgreSQL-Compatible Edition を利用しているシステムがあり、PostgreSQLのバージョンが13系でした。 Aurora PostgreSQL のリリースカレンダーを確認すると Auroraの標準サポート終了日が迫っていることに気がついたため、バージョンアップ計画とバージョンアップ手順の作成していました。 DBメンテナンスの事前作業手順にECSタスクのタスク停止し、アプリケーションからデータベースへのアクセスを防ごうとしていたのですが、タスクをAWSマネジメントコンソールからタスク停止を行ったところ数分後にタスクが立ち上がっていました。 もしこれが本番環境だった場合、アプリケーションからDBの操作が発生し事故に発展する可能性があります。 正しいECSタスクの止め方とユーザーからのアクセスを止める方法について述べていきます。 2.2. 復活した理由 結論:ECSサービスが「あるべき姿(Desired Count)」を維持しようとしたためです。 ECSサービスには、*「常に実行しておきたいタスクの数」*を指定する desiredCount(希望するタスク数)という設定があります。 ECSサービスは、以下のタスクを監視しています。 理想(Desired): ユーザーが設定した「実行したいタスク数」 現実(Running): 実際に動いているタスクの数 今回、私が手動でタスクを停止したことで、ECSサービスは「現実が理想を下回った」と判断しました。その結果、サービスは自動的に新しいタスクを起動し、差分を埋めようとしたのです。 ※ ECSにとって、手動停止もシステム障害も「タスクが減った」という事実に変わりはありません。desiredCount が 0 でない限り、タスク内のコンテナが復活します。 3. 正しい対処方法 ECS 上で稼働させているアプリケーションからDB にアクセスさせたくないケースがあるのであれば、タスクを停止するという方法はおすすめできません。 前述したとおり、ECS サービスで設定したdesiredCountの設定値通りのコンテナをECS サービスが稼働させ続けようとするからです。 以下、ECS へ接続を防ぐ方法の一例です。 3.1. タスクを停止する場合 ECS タスク内のコンテナを停止させたい場合は、ECS サービスの desiredCount を 0 に設定を変更させます。 この設定により ECS サービスのがECS タスク内のコンテナ数を 0 に自動的に保つようになります。 3.2. ALB (Application Load Balancer) の場合 セキュリティグループのインバウンドルールを一時的に削除(または許可されていないものに変更)する方法です。 これにより、ECSタスクが動いていたとしても、外部からのリクエストがDBに到達する前にALBで遮断されます。 ※注意: ユーザーにはタイムアウトやエラー画面が表示されるため、あらかじめメンテナンス画面(Sorryページ)への切り替え設定もセットで検討するのが理想的です。 4. 学び 4.1. タスク停止ではなくサービスの設定変更 ECS などのクラウドネイティブなリソースは、停止ではなく、サービスの設定変更で対応するのが理想的です。

CloudFormation運用で事故らないための削除防止について

  • POSTS
1. はじめに CloudFormation(以下、CFnと呼ぶ)は、AWSのリソースの構築、管理、更新する上で非常に便利な IaC です。 一方で、CFn でリソースの更新を行う際、意図せずの更新、削除が行われるケースがあります。 本番環境で CFn を運用する中で意図しない更新や削除は行いたくないものです。 CFn 運用時の削除防止について記述していきます。 2. 削除防止機構の種類と説明 2.1. スタックポリシー(Stack Policy) スタックポリシーは、意図しない更新からリソースを保護することに役立ちます。 スタックを作成するとすべてのリソースが更新を許可されていますが、スタックポリシーを設定することでスタック内のすべてのリソースが更新できないようになります。 デフォルトではすべてのリソースが更新不可になりますがスタックポリシーの設定で更新不可対象のリソースを選択することができます。 ※ スタックポリシーは、更新のみ対応しており、削除は対応しいません。 2.2. 削除ポリシー(Deletion Policy) 削除ポリシーは、スタックの削除が行われた際のリソースの扱いを指定することが可能です。 2.2.1. 保持 削除ポリシーで「保持」を設定した場合でもAWSリソースの削除は行われません。 2.2.2. スナップショット スタック削除された場合、AWS リソースが削除される前にスナップショットを取得します。 ※ この機能は、スナップショット機能がサポートされているAWSリソースに限ります。 例)EC2、RDS、EFS等 2.2.3. 削除 削除ポリシーで「削除」を設定した場合、AWSリソースは削除されます。 ※ 削除ポリシーはデフォルトでは、「削除」が設定されています。 2.3. 終了保護 終了保護は、スタック自体の削除防止を目的とした機能です。 削除保護を有効にするとAWSマネジメントコンソール等からスタックの削除できなくなります。 また、対象のスタックがネステッドスタックの場合、親スタックに終了保護が適用されていれば、子スタックに対しても終了保護が適用されます。 ただし、注意すべき点があります。終了保護はスタック自体の削除は保護されますが、リソースの更新に伴う削除からはリソースを守ることができません。 例)CFn で S3バケット のリソースを作成されていて、CFn テンプレートからS3バケットの記述を削除後、スッタックの更新をした場合はS3バケットは削除されます。 3. 削除防止で注意すべき点 2. 削除防止機構の種類と説明 でAWS が提供している3つの削除保護機構について説明してきました。 これらはAWSリソース、スタックの意図しない削除や更新から環境を守るために非常に強力な機能です。 しかしながら、これらの機能単体ではスタックやリソースを守り切ることはできません。 スタックポリシーでは、スタック内のリソースの意図しない更新を防ぐことはできますが、スタック内リソースの削除は防ぐことはできません。そのため、スタックポリシーだけではなく、削除ポリシーを有効にすることで意図しない削除からAWSリソースの保護を行うことが必要です。また、スタック自体の削除をフェールセーフの観点から防ぐためにも設定しておく必要があるでしょう。 このように、スタックポリシー、削除ポリシー、スタックポリシーを単体で適用するだけはスタック、リソースを守るには不十分で3つの削除保護機構を組み合わせることでより安全に CFn の運用が可能になります。 ご自身の現場に合う設定の組み合わせを考えてみるのがいいと思います。 4. ポリシーのテンプレート例 4.1 スタックポリシー AWSドキュメントのスタックポリシー例です。

S3の同一リージョンレプリケーションのユースケースについて調べてみた

  • POSTS
1. はじめに 今回は、S3の同一リージョンレプリケーションについて学んでみました。 S3には、クロスリージョンレプリケーション(CRR), 同一リージョンレプリケーション(SRR)の二種類のレプリケーション方式があります。 2つのレプリケーションは名前の通り、CRRはリージョン間でS3のオブジェクトのコピーを行い、SRRは同一リージョン内でS3オブジェクトのコピーを行うことをいいます。 今回この記事を書こうとしたきっかけは、いまいちユースケースが思いつかなかったためです。 なのでドキュメントを読んでユースケースを書いていこうと思います。 2. 構成図 図の左:同一リージョンレプリケーション(SRR)、図の右:クロスリージョンレプリケーション 3. 同一リージョンレプリケーションとは(SRR)? 同一リージョンレプリケーション(SRR)とは、同じAWSリージョン内のS3バケット間でオブジェクトを自動的にコピーする機能です。 4. 同一リージョンレプリケーション(SRR)のユースケース 同一リージョンレプリケーションはどのようなユースケースで利用されるのでしょうか? 4.1. ログの集約 1つ目のユースケースは、複数のバケットや複数のアカウントにログを保管している場合、ログを簡単にコピーすることができます。 そうすることによって、ログの管理をシンプルにすることができます。 4.2. 本番稼働アカウントとテストアカウント間のライブレプリケーション 2つ目のユースケースは、アプリケーションの開発・検証中に本番環境のS3バケットのデータで検証を行いたいケースがあります。 同一リージョンレプリケーションを利用することによって、本番環境アカウントのS3バケットのデータを開発アカウントのS3バケットにコピーすることで、 開発・検証中に本番相当のデータを利用できるようになります。 4.3. データ主権に準拠する必要がある場合 S3のバックアップを遠隔地保管したいケースがあります。この場合、国外のリージョンへの保管を検討することがあるともいます。 しかし、法律やコンプライアンスの規制によりデータを国外のリージョンに保管できないケースがあります。 この場合、同一リージョンの別アカウントにS3のデータをコピーするケースがあります。 5. SRRの便利機能 5.1. S3 Replication Time Control S3 Replication Time Control (S3 RTC) という機能があります。この機能を利用すると99.9%のオブジェクトが15分以内にコピーすることができます。 この機能は、ビジネス要件で15分以内にコピーを完了させる必要がある場合、利用されることがあります。 6. レプリケーションでコピーされる設定・コピーされない設定 6.1. レプリケーションでコピーされるもの レプリケーション設定でコピーされる項目を一部列挙します。 レプリケーション設定の追加後に作成されたオブジェクト 暗号化されていないオブジェクト ユーザー提供のキー (SSE-C) を使用して暗号化されたオブジェクト、Amazon S3 マネージドキー (SSE-S3) の下で保管時に暗号化されたオブジェクト、および AWS Key Management Service (SSE-KMS) に保存されている KMS キーで暗号化されたオブジェクト レプリケート元オブジェクトからレプリカへのオブジェクトメタデータ 作成日、更新日付等 オブジェクトタグ、存在する場合。 S3 オブジェクトロックの保持情報 6.1. レプリケーションでコピーされないもの レプリケーション設定前のオブジェクトはレプリケーション先にコピーされません。 もしコピーした場合は、別途レプリケーションを実行する必要があります。

AWS Backup の基本機能について調べてみた

  • POSTS
1. はじめに AWSでAuorora, S3, EFSのバックアップ方法について検討していると、AWS Bacupというサービスがあることがわかりました。 RDSなどのサービスにはAWS Backupを利用せずに個別でバックアップ機能が備えられていますが、 AWS Backupを利用するメリット等、調べていました。 2. AWS Backupとは AWS Backupとは、AWSのさまざまなサービスにわたるバックアップを一元的に管理し、自動化するためのバックアップサービスです。AWS Backupを利用することで、複数のサービス(Amazon Aurora, Amazon S3, Amazon EFS, Amazon EC2, Amazon RDSなど)のバックアップを一元的に定義・実行できます。 ※この記事では、Amazon Aurora のバックアップについて取り扱います。 3. 構成要素 AWS Backupは、主に以下の3つの要素で構成されています。これらが連携することで、バックアップの**「どこに」「何を」「いつ・どのように」**実行するかを定義し、管理します。 3.1. バックアップボールト (Backup Vault) これは、作成されたバックアップデータが安全に保存される保管場所です。 保存場所: バックアップボールトは、バックアップされたリソースのデータが保管される場所です。 暗号化: バックアップデータは、KMSキーを使用して暗号化され、安全性が確保されます。 アクセス制御: IAMポリシーを使用して、誰が、いつ、どのようにボールト内のデータにアクセスできるかを厳密に制御できます。 ロック機能: ボールト内のバックアップを一定期間変更・削除できないようにロックする機能(Vault Lock)があり、コンプライアンス要件への対応に役立ちます。 3.2. バックアッププラン (Backup Plan) これは、**「いつ、どのように」**バックアップを作成するかを定義する要素です。 スケジュール設定: バックアップを作成する頻度(日次、週次、月次など)と時刻を定義します。 頻度とウィンドウ: バックアップジョブを実行する時間帯(バックアップウィンドウ)や、許容される完了時間を設定できます。 ライフサイクル設定: バックアップの保持期間を定義します。また、コールドストレージへの階層化(例:30日後に低コストのストレージに移行)のポリシーを設定し、コスト効率を高めることができます。 コピー設定: 異なるAWSリージョンや、別のAWSアカウントのバックアップボールトへ、自動的にバックアップをコピーする設定(クロスリージョン/クロスアカウントコピー)を含めることができます。 3.3. バックアップセレクション (Backup Selection) これは、**「どのAWSリソース」**をバックアッププランの対象とするかを定義するものです。 対象リソースの特定: 特定のAWSリソースタイプ(Aurora DBクラスタ、S3バケット、EFSファイルシステムなど)の中から、実際にバックアップを取得するインスタンスやボリューム、ファイルシステムを指定します。 4. メリット 4.1 一元管理 AWS Backupを利用することで、バックアップの一元管理を行うことが可能です。 Amazon Aurora のクラスターを複数管理しているアカウントがあるとします。 これらのクラスターごとでバックアップ設定を行うことは、手間がかかります。

AWS Glue CrawlerによるS3データレイクの「自動テーブル作成&パーティション管理」

  • POSTS
1. はじめに この記事ではS3データレイクで自動テーブル作成とパーティション管理について記述していきます。 1.1 問題提起 データレイク(S3)にデータが蓄積されていく中で、分析に必要な「テーブル定義」やパーティションを手動で作成・更新することは非常に手間で非効率です。 また、手動で実施することによるミスも生じやすくなります。AWS Crawlerを利用することで、自動的にテーブル定義の作成やパーティションの追加を行うことが可能になります。 1.2. 具体例 新しいデータセットが追加されるたびに、AthenaでCREATE EXTERNAL TABLEを手打ちしている。 データが毎日増えるたびに、MSCK REPAIR TABLEやALTER TABLE ADD PARTITIONを実行し忘れてクエリに漏れが生じる。 3. AWS Glue Crawler とは AWS Glue Crawlerは、AWS GlueというAWSのフルマネージド型ETL(抽出・変換・ロード)サービスを構成する機能の一部です。 3.1. AWS Glue Crawlerの役割 データソースの走査(クロール) S3のファイルや各種データベースなどのターゲットデータストアに接続し、データを読み取ります。 スキーマの推論・解析 データの形式(CSV、JSON、Parquetなど)やカラム名、データ型などのスキーマ情報を自動で識別・推論します。 データカタログへの登録 推論したスキーマ情報に基づき、Glue Data Catalogにデータベースとテーブル定義を作成または更新します。 スキーマ変更の自動検出 定期的にクローラーを実行することで、データストアに新しいファイルが追加されたり、既存のデータのスキーマが変更されたりした場合も自動的に検出し、Data Catalogを更新できます。 3.2 メリット Glue クローラーを利用することで、分析対象のデータのスキーマを手動で定義する手間が削減されます。これにより、Amazon AthenaやAmazon Redshift Spectrumなどの他の分析サービスから、Data Catalogに登録されたメタデータを使って、すぐにデータにクエリを実行できるようになります。 4. 構築 AWS Glue CrawlerでS3のスキーマとパーティションを作成するための前準備です。 4.1. CloudFormationテンプレート(例) 以下、S3, Glue Crawler、Glue DataBaseのCloudFormationテンプレートです。 参考にしてみてください。 AWSTemplateFormatVersion: '2010-09-09' Description: AWS Glue Crawler, IAM Role, and S3 Bucket for Athena Partition Management Parameters: BucketName: Type: String Default: athena-partition-data Resources: AthenaDataBucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub "${BucketName}-${AWS::AccountId}-${AWS::Region}" AccessControl: Private GlueCrawlerServiceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: glue.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole Policies: - PolicyName: S3AccessPolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:GetObject - s3:PutObject - s3:ListBucket Resource: - !GetAtt AthenaDataBucket.Arn - !Sub "${AthenaDataBucket.Arn}/*" GlueDatabase: Type: AWS::Glue::Database Properties: CatalogId: !Ref 'AWS::AccountId' DatabaseInput: Name: "glue-database-name" Description: Database for Athena queries AthenaPartitionCrawler: Type: AWS::Glue::Crawler DependsOn: GlueDatabase Properties: Name: athena-partition-update-crawler Role: !GetAtt GlueCrawlerServiceRole.Arn DatabaseName: !Ref GlueDatabase Targets: S3Targets: - Path: !Sub "s3://${AthenaDataBucket}/room_temperature_data/" SchemaChangePolicy: UpdateBehavior: LOG DeleteBehavior: LOG Outputs: DataBucketName: Description: "Data Bucket Name for CSV files" Value: !Ref AthenaDataBucket 4.2. S3のフォルダ構造 AWS Glue Crawlerがクロールする対象は、4.1 のTargets→S3Targets→Pathが room_temperature_data/ で指定します。 room_temperature_data/ 配下のフォルダ構造をAWS Glue Crawlerが自動的に解析してパーティションの追加やスキーマの作成を行ってくれます。

EKSの Access Entry について

  • POSTS
1. はじめに EKS クラスターを作成したのはいいが、kubectl で Kubernetes API をコールした際、アクセス権限のエラーが出力されたということはありませんか。 よくある理由としては、デフォルト設定では、 Kubernetes API のコールは、クラスターを作成した IAM ユーザーに限られます。 クラスターは、Terraform 等でクラスター作成され、Terraform 用 IAM ユーザーが利用されます。 そのため、自分自身のIAM ユーザーで Kubertnetes API をコールしても、Kubernetes API にアクセスする権限が与えられていないため、Kubernetes API を呼び出すことができないのです。 こういった際にKubernetes API をコールする必要がある IAM ユーザーにアクセス権限を与えるために利用されるのが、Access Entry です。 本記事では、Access Entry の説明や設定例について記述してゆきます。 Access Entry とは? Access Entry は、IAM ユーザーに対して、Kubernetes API へのアクセス許可を行う最適な方法です。 Access Entry はなぜ必要なのか? 設定例(Terraform) resource "aws_eks_access_entry" "console_user" { cluster_name = module.eks.cluster_name principal_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:user/terraform" type = "STANDARD" } resource "aws_eks_access_policy_association" "console_user_admin" { cluster_name = module.eks.cluster_name policy_arn = "arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy" principal_arn = aws_eks_access_entry.console_user.principal_arn access_scope { type = "cluster" } } resource "aws_eks_access_entry" "root_user" { cluster_name = module.eks.cluster_name principal_arn = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root" type = "STANDARD" } resource "aws_eks_access_policy_association" "root_user_admin" { cluster_name = module.eks.cluster_name policy_arn = "arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy" principal_arn = aws_eks_access_entry.root_user.principal_arn access_scope { type = "cluster" } } resource "aws_eks_access_entry" "bastion" { cluster_name = module.eks.cluster_name principal_arn = var.bastion_iam_role_arn type = "STANDARD" depends_on = [module.eks] } 4. おわりに 5. 参考 EKS アクセスエントリを使用して Kubernetes へのアクセスを IAM ユーザーに許可する

AWSコスト配分タグで始めるコスト管理

  • POSTS
1. はじめに AWS上でプロジェクトごとの料金を把握できていますか。 AWSアカウント上に複数のプロジェクトが稼働していて、特定のプロジェクトでどのくらい料金がかかっているか確認する方法を書いていきます。 プロジェクトごとに料金を把握するのに必要な要素は、 Billing and Cost Management の コスト配分タグ です。 コスト配分タグについて学んでいきましょう。 2. コスト配分タグとは? コスト配分タグとは、AWSリソースにタグ付けを行い、コストをタグ単位で分析、可視化できる仕組みのことを言います。 2.1 コスト配分タグの概要 タグは、多くのAWSリソースにKey, Valueの形式で付与可能です。 リソースタイプ キー バリュー Lambda Project cloud-steps S3 Project cloud-steps このようにLambda, S3にProjectキーを付与することができます。 Projectごとにタグを設定するとcloud-stepsで利用しているリソースを抽出することができます。 2.1 「ユーザー定義タグ」と「AWS生成タグ」の違い ユーザー定義タグとAWS生成タグの違いについて説明します。 ユーザー定義タグとは、その名の通りユーザーがAWSリソースに対して定義できるタグのことです。 CloudFormationテンプレート例 VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 192.168.0.0/20 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name - Key: Project 一方で、AWS生成タグとは、AWSが自動的にAWSリソースに付与するタグのことをいいます。 AWSタグ例 aws:cloudformation:stack-id aws:createdBy aws:cloudformation:stack-name 3. コスト配分タグの使い方ステップ 3.1. タグの付与 タグをリソースに付与します。 タグの付与単位は各現場のタグの付与方針によります。 ここでは、プロジェクト単位でタグを付与します。 タグの設定意図は、プロジェクト単位のコストを可視化すとためです。 VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 192.168.0.0/20 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Project Value: cloud-steps 3.2. コスト配分タグ(ユーザー定義タグ)の有効化 AWSマネージメントコンソールの検索フォームから Billing and Cost Management 左メニューのコスト組織>コスト配分タグをクリックする コスト配分タグ画面が表示されたらユーザー定義のコスト配分タグタブを選択 コスト配分タグとして有効化したいタグキーにチェックを入れる。※ここでは、cloud-stepsを選択 有効化ボタンをクリック 3.3. コスト配分タグ(AWS生成コスト配分タグ)の有効化(任意) AWSマネージメントコンソールの検索フォームから Billing and Cost Management 左メニューのコスト組織>コスト配分タグをクリックする コスト配分タグ画面が表示されたらAWS生成コスト配分タブを選択 コスト配分タグとして有効化したいタグキーにチェックを入れる。※ここでは、aws:createdByを選択する 有効化ボタンをクリック 3.4. コストエクスプローラーの利用 AWSマネージメントコンソールの検索フォームから Billing and Cost Management 左メニューのコストと使用状況の分析>Cost Explolerを選択する 右メニューのレポートパラメータのフィルター機能でユーザータグごとのコストを抽出する グループ化の条件>ディメンション>Tag>Project フィルター>タグ>Project>cloud-stepsをクリックする。 5. 躓いたポイント コスト配分タグは有効化直後反映されないことがあります。

複数Lambda × API Gateway をCDKでスマートに構築する方法(IAM分離・JSON管理付き)

  • POSTS
1. はじめに Lambda ✕ ApiGatewayでAPIを構築することが良くあります。 この構成をAWS SAM や CloudForamtionで構築することがありましたが、APIが数十個構築する必要があるとLambdaごとにテンプレートを作成するのが大変になります。 また、手作業でテンプレートをAWS SAM に記載すると追加漏れや修正漏れが発生することが、見受けられました。 こういった場面で CDK を利用するとスマートに構築することができます。 2. やりたいこと Lambdaを複数定義する。 API GatewayとLambdaを紐付ける。 IAM を別スタックに分離する。 CLoudWatch のロググループを明示的に作成する。 前提 AWS CLIインストール済みであること Python3.13インストール済みであること AWS CDKインストール済みであること 3. 構成 3.1. スタックの構成 AppStack IamStack ↓ ↓ [Lambda] [IAM Role] ↓ [LogGroup] ↓ [API Gateway] 3.2. ディレクトリ構造 . └── cdk_test ├── app.py ├── cdk.json ├── functions.json ├── lambda │ ├── lambda_1 │ │ └── handler.py │ ├── lambda_2 │ │ └── handler.py │ └── handler.py ├── requirements-dev.txt ├── requirements.txt ├── source.bat ├── stacks │ ├── __init__.py │ ├── app_stack.py │ └── iam_stack.py 4. Lambdaの定義をjsonで管理するメリット Lambdaの追加や設定の変更時にコードを修正する必要がなくなる。 5. 実装コード紹介 5.1 functions.json Lambdaを追加する際はこのjsonファイルに記述する。

CloudWatchのログをboto3でフィルタリングする

  • POSTS
1. はじめに CloudWatch Logsに出力されるログによってプログラムの処理フローを分岐する必要がある要件がありました。 これまでCloudWatch Logsを操作する機会がなかったため、boto3を用いたログのフィルタリング方法について備忘録として記事を残します。 2. CloudWatch Logsとは CloudWatch Logsは、Lambda、EC2、CloudTrail、Route53などのAWSリソースから出力されるログをモニタリング、保存、検索するためのサービスです。 AWSマネジメントコンソールからログの閲覧や文字列検索が可能なほか、例えば ERROR という文字列を検出したタイミングでCloudWatch Alarmをトリガーし、SNSで通知を行うこともできます。 3. 環境 AWS Lambda(Python 3.13) boto3 リージョン:us-west-2 4. boto3でCloudWatch Logsをフィルタリングする 4.1 boto3とは boto3は、PythonからAWSリソースを操作するための公式SDK(Software Development Kit)です。 ※ Lambdaを利用している場合、boto3はデフォルトで利用することができます。 今回はCloudWatch Logsのfilter_log_events APIを使い、特定のパターンにマッチするログを抽出します。 filter_log_eventsを利用して、Pythonでログの解析、分析に役立てることができます。 4.2 サンプルソースコード 以下のプログラムは、CloudWatch Logs に出力された過去1時間分のログから “START_DATE” と “SUCCESS” を含む JSON 形式のログメッセージを抽出し、START_DATE の中で最新の日付を1件だけ取得・表示する Lambda 関数です。 import boto3 import time from datetime import datetime, timedelta import json import logging logger = logging.getLogger("my_lambda_logger") logger.setLevel(logging.INFO) if not logger.handlers: handler = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) client = boto3.client('logs', region_name='us-west-2') log_group_name = '/aws/lambda/log-group-name' def lambda_handler(event, context): end_time = int(time.time() * 1000) start_time = int((datetime.utcnow() - timedelta(minutes=60)).timestamp() * 1000) start_dates = [] next_token = None while True: kwargs = { "logGroupName": log_group_name, "startTime": start_time, "endTime": end_time, "filterPattern": '?START_DATE ?SUCCESS' } if next_token: kwargs["nextToken"] = next_token response = client.filter_log_events(**kwargs) for e in response.get("events", []): try: message = json.loads(e["message"]) if "START_DATE" in message: start_dates.append(message["START_DATE"]) except Exception as ex: logger.warning(f"Failed to parse message: {e['message']} -- {ex}") next_token = response.get("nextToken") if not next_token: break logger.info(f"Collected START_DATEs: {start_dates}") if start_dates: dt_dates = [datetime.strptime(d, "%Y-%m-%d") for d in start_dates] dt_dates.sort(reverse=True) latest_one = dt_dates[:1] latest_one_str = [d.strftime("%Y-%m-%d") for d in latest_one] else: latest_one_str = [] 4.3 filter_log_eventsの解説 filter_log_events は、指定したロググループの中から特定の条件にマッチするログイベントを抽出するための boto3 の API です。大量のログデータの中から、必要な情報を取得するのに適しています。

LambdaでクロスアカウントのS3にアクセスする

  • POSTS
1. はじめに Lambdaから別AWSアカウントのリソースにアクセスする要件がたまにあります。 別AWSリソースにアクセスすることをクロスアカウントアクセスといいます。 ただ、私はクロスアカウントアクセスという単語を耳にしたことがありますが、自分自身で設定をおこなったことがなかったので、一度設定をしてみました。 ここでは、LambdaからクロスアカウントのS3にアクセスするための設定をまとめます。 2. 前提 AWSアカウントを2つ用意していること。 LambdaがあるアカウントをAアカウント、S3があるアカウントをBアカウントとする。 3. 関連知識 クロスアカウントアクセスに必要な知識を解説します。 3.1 AWS Security Token Service (AWS STS) とは AWS Security Token Service (以下、AWS STS) とは、AWSリソースへのアクセスコントロールできるサービスで一時的な認証情報発行します。 AWS STSは、クロスアカウントのアクセスや他要素認証などに利用されます。この一時的なクレデンシャルは数分~最大12時間までの有効期限を設定できます。 3.2 Assume Roleとは **Assume Role(アシュームロール)**とは、一時的に別の権限を持ったロールを使えるようにする仕組みです。 AWSでは、通常IAMユーザーやLambdaなどが操作を行いますが、Assume Roleを使うと、 一時的な認証情報を作成して、そのロールを引き受けて、そのロールが持っている権限でAWSサービスにアクセスできます。 この一時的な認証情報は**AWS STS(Security Token Service)**が発行します。 4. AWS構成図 5. クロスアカウントアクセスするための設定 5.1 Aアカウント側のLambdaの実行ロール Lambda実行ロール作成します。 クロスアカウントアクセスするために重要なのが、sts.AssumeRoleを付与しやポリシーを作成することです。 Resourceには、クロスアカウント先のロールを取得します。 ここでは、アカウントBに作成するS3にアクセスするための、ロールを作成し、そのロールを引き受けられるように設定します。 AWSTemplateFormatVersion: '2010-09-09' Resources: LambdaExecutionRole: Type: AWS::IAM::Role Properties: RoleName: 'lambda-execution-role' AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: / Policies: - PolicyName: 'allow-cloud-watchlogs-access' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:CreateLogStream - logs:PutLogEvents - logs:DescribeLogStreams - logs:CreateLogGroup Resource: '*' - PolicyName: 'allow-access-s3-bucket' PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: sts:AssumeRole Resource: arn:aws:iam::{アカウントB}:role/CrossAccountLambdaAccessRole 5.2 Lambdaのアプリケーションコード STSでアカウントBのCrossAccountLambdaAccessRoleへの一時的な認証情報を取得し、アカウントAのLambdaがCrossAccountLambdaAccessRoleを引き受けます。