Systems Managerを使用したCloudWatchエージェントのインストールとアプリケーションログの出力
前提
- VPC、サブネットなどのネットワーク周りが構築済み
- プライベートサブネットにEC2インスタンス(Linux)を起動済み
作業の流れ
- VPCエンドポイント作成
- IAMロール作成
- CloudWatchエージェントのインストール
- CloudWatchエージェントのパラメータ設定
1. VPCエンドポイント作成
今回必要なエンドポイントは以下。
- com.amazonaws.region.ssm
- com.amazonaws.region.ec2messages
- com.amazonaws.region.ssmmessages
作成方法は、こちらを参考
作成時に選択するセキュリティグループは、
以下のインバウンドルールを設定したものをアタッチしてください。
- port:443
- source:使用するVPCのCIDR
2. IAMロール作成
続いて、EC2インスタンスへアタッチするIAMロールを作成します。
ユースケースで EC2 を選択して次へ
以下のポリシーをアタッチ。
- AmazonSSMManagedInstanceCore(AWS管理ポリシー)
- CloudWatchAgentServerPolicy (AWS管理ポリシー)
任意のロール名、説明を入力
信頼されたエンティティは変更せずこのまま進みます。
任意でタグを追加後、ロールを作成をクリックして完了となります。
作成したIAMロールは使用するEC2インスタンスへアタッチしてください。
補足
ポリシーにCloudWatchAgentServerPolicyをアタッチしましたが、
アクセス権限の中に以下の様な記述があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudwatch:PutMetricData",
"ec2:DescribeVolumes",
"ec2:DescribeTags",
"logs:PutLogEvents",
"logs:DescribeLogStreams",
"logs:DescribeLogGroups",
"logs:CreateLogStream",
"logs:CreateLogGroup"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter"
],
"Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-*"
}
]
}
上記のAWS管理ポリシーを使用する場合、後程作成するSSMパラメータストアのリソース名が「AmazonCloudWatch-」から始まるものに限定される形となってしまいます。
任意の名前を設定する必要がある場合は、上記のJSONを使用してカスタムポリシーを作成し、以下の「AmazonCloudWatch-*"」の箇所を修正してください。
"Resource": "arn:aws:ssm:*:*:parameter/AmazonCloudWatch-*"
3. CloudWatchエージェントのインストール
インストールする準備が出来たので実際に行っていきます。
インストールはSystems Manager RunCommandを使用します。
設定内容は以下。
- ドキュメント:AWS-ConfigureAWSPackage
- バージョン:1(デフォルト)
- Action: Install
- Installation Type: Uninstall and reinstall
- Name: AmazonCloudWatchAgent
- Version: latest
- Additional Arguments: デフォルトのまま
今回、ターゲットは手動で選択します。
選択可能なものが表示されるのでインストール先のインスタンスにチェックを入れてください。
注意点として、インスタンスが停止していると候補として表示されません。
また、インスタンスをプライベートサブネットに配置している場合はVPCエンドポイントが未設定の場合、起動済みでも表示されないのでこちらも注意が必要となります。
インスタンス選択以降の設定は今回以下としています。
全て入力したら実行をクリックしてインストールを開始します。
ステータスが成功となったらインストールは完了となります。
4. CloudWatchエージェントのパラメータ設定
CloudWatchエージェントのインストール後、ログ出力の設定を
Systems Managerパラメータストアで作成していきます。
名前は任意名ですが、IAMロール作成時に記載した通り
AWS管理ポリシーの場合、「AmazonCloudWatch-*"」から始まるものに
限定される為、今回はそれに従い設定していきます。
それ以外の設定については以下。
- 説明 : 任意
- 利用枠: 標準
- タイプ: 文字列
- データ型: text
値には以下のJSONを記述します。
{
"logs":{
"logs_collected":{
"files":{
"collect_list":[
{
"file_path":"/var/log/messages",
"log_group_name":"/var/log/messages",
"log_stream_name":"{instance_id}"
},
{
"file_path":"/var/log/httpd/access_log",
"log_group_name":"HttpAccessLog",
"log_stream_name":"{instance_id}"
},
{
"file_path":"/var/log/httpd/error_log",
"log_group_name":"HttpErrorLog",
"log_stream_name":"{instance_id}"
}
]
}
}
}
}
最後に任意でタグを設定後、パラメータを作成をクリックして完了となります。
最後に作成した設定をCloudWatchエージェントと同様、
SSM RunCommandで反映していきます。
- ドキュメント: AmazonCloudWatch-ManageAgent
- バージョン: 6(デフォルト)
- Action: Configure
- Mode: ec2
- Optional Configuration Source: ssm
- Optional Configuration Location: パラメータストアで作成したパラメータ名
上記以外はデフォルトのまま進みます。
ターゲット以降についてはCloudWatchエージェントインストール時の設定と同様としています。
設定後、実行をクリックしてステータスが成功となれば反映は完了です。
まとめ
今回はSystems Managerを使用して実施してみましたが、
インスタンス内で作業せずにCloudWatchLogsとの連携まで出来るのは非常に便利ですね。
Systems Managerは他の用途でも使用する場面の多そうなサービスですので、
今後もいろいろ試していければと思います。
参考記事
AmazonCloudWatch-ManageAgentドキュメントでCloudWatchエージェントを設定する際の挙動を確認した
プライベートサブネットにあるEC2インスタンスを Systems Manager で管理する
Systems Managerを使ってCloudWatchエージェントを導入・設定してみた
Discussion