Systems Manager の Run Command の実行時に S3 にコマンド出力ログが記録されない事象の解消法
困っていること
Systems Manager の Run Command を実行しました。
その際に、出力オプションで S3 バケットへログの出力を有効にしました。
コマンドを実行しましたが、S3 バケットにログが存在しておりませんでした。
どのように修正すればいいですか?
どう対応すればいいの?
マネージドノードにアタッチされている IAM ロールの権限が不足していないかをご確認ください。
SSM エージェント動作の前提条件では、AWS 管理ポリシーの AmazonSSMManagedInstanceCore
を EC2 インスタンスにアタッチされてる IAM ロールに付与する必要があります。
{ "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : [ "ssm:DescribeAssociation", "ssm:GetDeployablePatchSnapshotForInstance", "ssm:GetDocument", "ssm:DescribeDocument", "ssm:GetManifest", "ssm:GetParameter", "ssm:GetParameters", "ssm:ListAssociations", "ssm:ListInstanceAssociations", "ssm:PutInventory", "ssm:PutComplianceItems", "ssm:PutConfigurePackageResult", "ssm:UpdateAssociationStatus", "ssm:UpdateInstanceAssociationStatus", "ssm:UpdateInstanceInformation" ], "Resource" : "*" }, { "Effect" : "Allow", "Action" : [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource" : "*" }, { "Effect" : "Allow", "Action" : [ "ec2messages:AcknowledgeMessage", "ec2messages:DeleteMessage", "ec2messages:FailMessage", "ec2messages:GetEndpoint", "ec2messages:GetMessages", "ec2messages:SendReply" ], "Resource" : "*" } ] }
しかし、上記のポリシーは S3 への書き込み権限がありません。
そのため、下記のように S3 への書き込み権限が定義された IAM ポリシーを IAM ロールに付与する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PutRunCommandLog", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:PutObjectAcl" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }
※DOC-EXAMPLE-BUCKET
は出力先の S3 バケット名に置き換えてください。
補足
メンテナンスウィンドウからタスクを実行する場合も、出力オプションの設定で S3 バケットへのログ出力が可能です。
この場合も、マネージドノードにアタッチされている IAM ロールに、S3 への書き込み権限が定義された IAM ポリシーを付与してください。
参考資料
AmazonSSMManagedInstanceCore - AWS マネージドポリシー
ステップ 1: Systems Manager にインスタンスのアクセス許可を設定する - AWS Systems Manager
Systems Manager Run Command の出力を別の AWS アカウントの S3 バケットに送信する | AWS re:Post