GitリポジトリとしてAWS CodeCommitを使う

Gitでソース管理をするにあたって、AWSにも CodeCommit というGitリポジトリを作れるサービスがあります。実際にリポジトリを作ってsshで接続できるようにするまでのメモです。

AWS CodeCommit

AWS CodeCommit は、完全マネージド型ソースコントロールサービスで、安全で非常にスケーラブルなプライベート Git リポジトリを簡単にホスティングできます。
Amazon CodeCommit(安全でスケーラブルなマネージド型ソースコントロールサービス) | AWS

料金

アクティブユーザが5人まで

  • 無料
  • 特典
    • 無制限のリポジトリ
    • 50 GB のストレージ/月
    • 10,000 回 のGitリクエスト/月

アクティブユーザが6人以上

  • 1 USD/月
  • 特典
    • 無制限のリポジトリ
    • アクティブユーザーごとに 10 GB のストレージ/月
    • アクティブユーザーごとに 2000 回 の Git リクエスト/月

つまり、個人で作ったコードを管理する分には、ほぼ無料の範囲内で利用できます。月に10,000回もgitリクエストを投げることは無いと思うので..。

仮に10,000回を超えたとしても、0.001 USD/Gitリクエスト なので大した料金にはならないでしょう。
ストレージについても、超過分については 0.06 USD/GB となっています。

類似サービスとの比較

類似のGitホスティングサービスとしては、Web上で利用できる GitHub や、サーバにインストールして使用する Gogs などがありますが、それらとの比較を簡単に書きます。(個人で使用する前提です)

  • 料金がほぼ無料(GitHubはプライベートリポジトリを作成する場合 $7/月)
  • 導入が簡単(GitHubは説明がEnglish、Gogsはサーバ(PC)へのインストールが必要)
  • プルリクエスト機能がない(GitHub、Gogs共に有り)

この他、Commit履歴の可視化や、タグ・ブランチの管理など、基本的な操作はGUIでできます。

AWS特有の機能としては、ブランチへのpushなどのイベントをトリガーとして、アラートを飛ばしたり、Lambda関数を実行できたりします。

リポジトリを作成してssh接続できるようにするまでの手順

sc 2017-09-21 14.02.22.png
今すぐ始める をクリック。

sc 2017-09-21 14.02.27.png

リポジトリ名 と 説明 を入力して リポジトリの作成 をクリック。

sc 2017-09-21 14.03.31.png

これでリポジトリが作成されました。
次の画面ではhttpssshそれぞれでの接続方法が書かれているので、この通りに準備をしていきます。

まず、ssh接続用のキーペアを生成します。既にキーペアを持っている場合は、新たに生成する必要はありません。
ここからはターミナルでの操作になります。(Macでの例です)

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_rsa): /Users/hogehoge/.ssh/codecommit_rsa  ;;;任意のパス、名前を指定します
Enter passphrase (empty for no passphrase): ;;;任意のパスフレーズを入力します
Enter same passphrase again: ;;;任意のパスフレーズを再度入力します
Your identification has been saved in /Users/hogehoge/.ssh/codecommit_rsa.
Your public key has been saved in /Users/hogehoge/.ssh/codecommit_rsa.pub.
The key fingerprint is:
SHA256:Ha6ETkhmC7muDZmmxzZk8DgRi7XZMpMU8khj4f3qzuQ hogehoge@HOGEHOGE.local
The key's randomart image is:
+---[RSA 2048]----+
|  o .+oo         |
| ..o..+. o       |
|.B.++ ..*        |
|O E..= + .       |
|.X... o S        |
|+. +   o         |
| .B +   .        |
|.o =oo           |
| .++ooo.         |
+----[SHA256]-----+

これでキーペアが生成されるので、パブリックキーの値をコピーします。

$ cat ~/.ssh/codecommit_rsa.pub
ssh-rsa AAAAB3NzaCino3r4aa2GpYkIpjzJAOOO8VcZw6eYfJr9RmdDNMS2/qcEk1yc2EAAAADAQABAAABAQDe0jBpJOHTSGuWRLmJT3s7RwGXw3rV56D4BDOasaCz24m3HxA8oXtRLsUZmiAf+LODBpoLPxWuBKfH/n1aseCByrmHV3FXhAHqH2v33EgrEeYm07xB1RifJHn5oXfCDpssfKVGd25FBslDgzjBElDjA+BRRGVI3lkitl2su19AtGa9b/jzj6UtdAc7msuR5ZM+MP/8jnq2zuc2YtMopt/YXdMAYuo1T0y6atVDmCqirSXE0+ITezFwzIEiximRkQHtO2B4CzJE9LF6kSD5RfLY9r0XHWcc+RpuO+QlD hogehoge@HOGEHOGE.local

AWS マネジメントコンソールに戻って、IAMの画面を表示します。
既存(または新規)のIAMユーザに対して、CodeCommitへのSSH接続キーを設定します。

IAM > ユーザー > {ユーザ選択} > 認証情報
sc 2017-09-21 14.19.34.png

sc 2017-09-21 14.19.40.png

先ほどコピーした ~/.ssh/codecommit_rsa.pub の内容を貼り付けて、SSH公開キーのアップロード をクリックします。

sc 2017-09-21 14.42.22.png

すると、赤枠の部分に SSHキーIDが表示されているので、これをコピーします。

ここから、再度ターミナルでの作業になります。

$ vi ~/.ssh/config 
Host git-codecommit.*.amazonaws.com
        User AAAAAAAAAAAAAA ;;;コピーした SSHキーID を記載
        IdentityFile ~/.ssh/codecommit_rsa ;;;先ほど生成したプライベートキーへのパス

ここまでで、sshの設定は完了です。
あとはpushするなりpullするなりcloneするなり、普段通りGitコマンドを叩いてください。

続きを読む

GCPとAWSのマルチクラウドで構築する、大規模解析サービスのシステム全体像 (1/4):CodeZine(コードジン)

前回の記事では、大規模解析サービスを実現するためにはさまざまなポイントがあることを説明し、その実現のためにクラウドプラットフォームであるGCPが活用できるという話をしました。今回は大規模解析サービスの例として、自社で開発している「KARTE」におけるシステム構成の全体像について説明をします。 大規模解析サービスの構成要素 大規模解析サービスは一般的に、以下の要素から構成されます。 ログ情報等のデー… 続きを読む

AWS CloudWatch で、Amazon Linux のパフォーマンスとログの監視をしてみる

0.はじめに

Amazon Linuxを利用していますが、
パフォーマンス監視は Zabbix を使って、
ログ監視は特に何も、
という感じでした。

CloudWatch のメトリクスの保存期間も長くなったみたいですし、
運用の手間やリスク、コスト削減も考慮して、
パフォーマンス監視を CloudWatch、
ログ監視を CloudWatch Logs、
にしようかと思います。

1.IAM Role へのポリシーのアタッチ

  1. 以下の IAM ポリシーを作成します。

    • ポリシー名 : GSCloudWatchWriteOnlyAccess ※ 任意
    • 説明 : ※ 任意
    • ポリシードキュメント :
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt1459146265000",
                "Effect": "Allow",
                "Action": [
                    "cloudwatch:PutMetricData"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Sid": "Stmt1459146665000",
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogGroup",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": [
                    "arn:aws:logs:*:*:*"
                ]
            }
        ]
    }
    

  2. 作成したポリシーを EC2 インスタンスに割り当てられている IAM Role に付与します。

1.CloudWatch へのメトリクスデータの送信

  1. 色々調べたところ、collectd と その CloudWatch 用プラグインを利用するのが一般的みたいなので、今回はその手順で進めていきます。

  2. collectd をインストールします。

    $ sudo yum -y install collectd
    

  3. collectd の CloudWatch 用プラグインをインストールします。

    $ git clone https://github.com/awslabs/collectd-cloudwatch.git
    $ cd collectd-cloudwatch/src
    $ sudo ./setup.py
    
    Installing dependencies ... OK
    Installing python dependencies ... OK
    Downloading plugin ... OK
    Extracting plugin ... OK
    Moving to collectd plugins directory ... OK
    Copying CloudWatch plugin include file ... OK
    
    Choose AWS region for published metrics:
      1. Automatic [ap-northeast-1]
      2. Custom
    Enter choice [1]: 
    
    Choose hostname for published metrics:
      1. EC2 instance id [i-00484bb5ac67e244d]
      2. Custom
    Enter choice [1]: 
    
    Choose authentication method:
      1. IAM Role [testuekamawindowsserver]
      2. IAM User
    Enter choice [1]: 
    
    Enter proxy server name:
      1. None
      2. Custom
    Enter choice [1]: 
    
    Enter proxy server port:
      1. None
      2. Custom
    Enter choice [1]: 
    
    Include the Auto-Scaling Group name as a metric dimension:
      1. No
      2. Yes
    Enter choice [1]: 
    
    Include the FixedDimension as a metric dimension:
      1. No
      2. Yes
    Enter choice [1]: 
    
    Enable high resolution:
      1. Yes
      2. No
    Enter choice [2]: 
    
    Enter flush internal:
      1. Default 60s
      2. Custom
    Enter choice [1]: 
    
    Choose how to install CloudWatch plugin in collectd:
      1. Do not modify existing collectd configuration
      2. Add plugin to the existing configuration
      3. Use CloudWatch recommended configuration (4 metrics)
    Enter choice [3]: 
    Plugin configuration written successfully.
    Creating backup of the original configuration ... OK
    Replacing collectd configuration ... OK
    Replacing whitelist configuration ... OK
    Stopping collectd process ... NOT OK
    Starting collectd process ... NOT OK
    Installation cancelled due to an error.
    Executed command: '/usr/sbin/collectd'.
    Error output: 'Error: Reading the config file failed!
    Read the syslog for details.'.
    

  4. collectd の起動に失敗しています。collectd の python 用ライブラリが足りないみたいなので、インストールします。

    $ sudo yum -y install collectd-python
    

  5. collectd を起動します。

    $ sudo service collectd start
    

  6. collectd の自動起動の設定をします。

    $ sudo chkconfig collectd on
    $ sudo chkconfig --list | grep collectd
    
    collectd           0:off    1:off    2:on    3:on    4:on    5:on    6:off
    

  7. /etc/collectd.conf の設定を変更します。

    $ sudo cp -frp /etc/collectd.conf /etc/collectd.conf.ORG
    $ sudo vi /etc/collectd.conf
    
    • cpu :

      • LoadPlugin cpu をコメント解除し、以下の設定を行う。
      <Plugin cpu>
              ReportByCpu false
              ReportByState true
              ValuesPercentage true
      </Plugin>
      
    • df :

      • LoadPlugin df をコメント解除し、以下の設定を行う。
      <Plugin df>
      #       Device "/dev/hda1" 
      #       Device "192.168.0.2:/mnt/nfs" 
      #       MountPoint "/home" 
      #       FSType "ext3" 
      #       IgnoreSelected false
              ReportByDevice false
              ReportInodes false
              ValuesAbsolute true
              ValuesPercentage true
      </Plugin>
      
    • load :

      • LoadPlugin load をコメント解除し、以下の設定を行う。
      <Plugin load>
              ReportRelative true
      </Plugin>
      
    • memory :

      • LoadPlugin memory をコメント解除し、以下の設定を行う。
      <Plugin memory>
              ValuesAbsolute true
              ValuesPercentage true
      </Plugin>
      
    • swap :

      • LoadPlugin swap をコメント解除し、以下の設定を行う。
      <Plugin swap>
              ReportByDevice false
              ReportBytes false
              ValuesAbsolute false
              ValuesPercentage true
      </Plugin>
      

  8. /opt/collectd-plugins/cloudwatch/config/whitelist.conf の設定を変更します。以下のメトリクスの中で不要なものがあれば、適当に削除して下さい。

    $ cd /opt/collectd-plugins/cloudwatch/config/
    $ sudo cp -frp whitelist.conf whitelist.conf.ORG
    $ sudo vi whitelist.conf
    
    cpu-.*
    df-root-df_complex-free
    df-root-df_complex-reserved
    df-root-df_complex-used
    df-root-percent_bytes-free
    df-root-percent_bytes-reserved
    df-root-percent_bytes-used
    load--load-relative
    memory--percent-free
    memory--percent-used
    memory--memory-free
    memory--memory-used
    swap--percent-cached
    swap--percent-free
    swap--percent-used
    

  9. collectd を再起動します。

    $ sudo service collectd restart
    

  10. CloudWatch のマネジメントコンソールの左側ペインから、「メトリクス」を選択します。カスタム名前空間の「collectd」→「Host, PluginInstance」→ EC2 インスタンスの ID でフィルタをかけて、設定したメトリクスのデータがあるか確認します。

    • FireShot Capture 165 - CloudWatch Management Console_ - https___ap-northeast-1.console.aws.png

    • FireShot Capture 166 - CloudWatch Management Console_ - https___ap-northeast-1.console.aws.png

    • FireShot Capture 171 - CloudWatch Management Console_ - https___ap-northeast-1.console.aws.png

2.CloudWatch Logs へのログデータの送信

  1. awslogs をインストールします。

    $ sudo yum -y install awslogs
    

  2. /etc/awslogs/awscli.conf の設定を変更します。

    $ sudo cp -frp /etc/awslogs/awscli.conf /etc/awslogs/awscli.conf.ORG
    $ sudo vi /etc/awslogs/awscli.conf
    
    [plugins]
    cwlogs = cwlogs
    [default]
    region = ap-northeast-1
    

  3. /etc/awslogs/awslogs.conf の設定を変更します。

    • apache や nginx の設定もしています。不要であれば、削除して下さい。
    $ sudo cp -frp /etc/awslogs/awslogs.conf /etc/awslogs/awslogs.conf.ORG
    $ sudo vi /etc/awslogs/awslogs.conf
    
    [/var/log/messages]
    datetime_format = %b %d %H:%M:%S
    file = /var/log/messages
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/var/log/messages
    
    [/var/log/cron]
    datetime_format = %b %d %H:%M:%S
    file = /var/log/cron
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/var/log/cron
    
    [/etc/httpd/logs/access_log]
    datetime_format = [%a %b %d %H:%M:%S %Y]
    file = /etc/httpd/logs/access_log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/etc/httpd/logs/access_log
    
    [/etc/httpd/logs/error_log]
    datetime_format = [%a %b %d %H:%M:%S %Y]
    file = /etc/httpd/logs/error_log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/etc/httpd/logs/error_log
    
    [/etc/httpd/logs/ssl_access_log]
    datetime_format = [%a %b %d %H:%M:%S %Y]
    file = /etc/httpd/logs/ssl_access_log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/etc/httpd/logs/ssl_access_log
    
    [/etc/httpd/logs/ssl_error_log]
    datetime_format = [%a %b %d %H:%M:%S %Y]
    file = /etc/httpd/logs/ssl_error_log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/etc/httpd/logs/ssl_error_log
    
    [/etc/httpd/logs/ssl_request_log]
    datetime_format = [%a %b %d %H:%M:%S %Y]
    file = /etc/httpd/logs/ssl_request_log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/etc/httpd/logs/ssl_request_log
    
    [/var/log/nginx/access.log]
    datetime_format = %Y/%m/%d %H:%M:%S
    file = /var/log/nginx/access.log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/var/log/nginx/access.log
    
    [/var/log/nginx/backend.access.log]
    datetime_format = %Y/%m/%d %H:%M:%S
    file = /var/log/nginx/access.log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/var/log/nginx/backend.access.log
    
    [/var/log/nginx/badactor.log]
    datetime_format = %Y/%m/%d %H:%M:%S
    file = /var/log/nginx/badactor.log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/var/log/nginx/badactor.log
    
    [/var/log/nginx/error.log]
    datetime_format = %Y/%m/%d %H:%M:%S
    file = /var/log/nginx/error.log
    buffer_duration = 5000
    log_stream_name = {instance_id}
    initial_position = start_of_file
    log_group_name = AmazonLinux/var/log/nginx/error.log
    

  4. awslogs を起動します。

    $ sudo service awslogs start
    

  5. awslogs の自動起動の設定をします。

    $ sudo chkconfig awslogs on
    $ sudo chkconfig --list | grep awslogs
    
    awslogs            0:off    1:off    2:on    3:on    4:on    5:on    6:off
    

99.ハマりポイント

  • 今回は、凡ミスばかりで本当に自分が嫌になりました…。もう、毎回、何やってんだ…。

  • CloudWatch へのメトリクスデータの送信では、 CloudWatch のカスタム名前空間の「collectd」ではなく、AWS の EC2 のフィルタに表示されると勘違いして、全然ログが出てこないと悩んでいました…。もう、本当馬鹿…。
  • 後、/etc/collectd.conf の設定も結構悩みました。
  • CloudWatch Logs へのログデータの送信では、/etc/awslogs/awscli.conf の設定を /etc/awslogs/awslogs.conf にすると勘違いして、本当に無駄な時間を浪費しました…。

XX.まとめ

以下、参考にさせて頂いたサイトです。
ありがとうございました。

続きを読む

AWS Greengrassが、アジアパシフィック (東京)リージョンで利用可能になりました。 | Amazon Web Services ブログ

Amazon Web Services ブログ AWS Greengrassが、アジアパシフィック (東京)リージョンで利用可能になりました。 by AWS Japan Staff | on 21 SEP 2017 | in AWS Greengrass , AWS IoT , Internet of Things | Permalink |  Share AWS Greengrassが、アジアパ… 続きを読む