ECS(Fargate)にログインする

               図A システム構成図
%docker container exec -it コンテナ名 bash
のようなことが、ECS Execの機能を利用してFargateでも可能です。
ECS ExecはSystems Manager Session Managerの機能を利用して実現しています。 ECS Execは追加費用なしで利用が可能です

(1)AWS CLI

%curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o "awscliv2.zip"
%unzip awscliv2.zip
%sudo ./aws/insstall 又は
%sudo ./aws/insstall --update  # updateの場合

(2)Session Manager plugin for the AWS CLI

%curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
%sudo yum install -y session-manager-plugin.rpm
  以下のコマンドを実行
  session-manager-plugin
  The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. と出力されれば、OK
##amazon Linux2の場合です。他のディストリビューションは未調査です。

(1)ECSのタスクロールに以下の権限を追加(ecsTaskExecutionRole)にカスタムポリシーとして追加

{  
 "Version": "2012-10-17",  
 "Statement": [  
     {  
     "Effect": "Allow",  
     "Action": [  
          "ssmmessages:CreateControlChannel",  
          "ssmmessages:CreateDataChannel",  
          "ssmmessages:OpenControlChannel",  
          "ssmmessages:OpenDataChannel"  
     ],  
    "Resource": "*"  
    }  
 ]  
}  

(2) fargateにログインするEC2に権限を追加

{  
  "Version": "2012-10-17",  
  "Statement": [  
      {  
          "Effect": "Allow",  
          "Action": [  
              "ecs:ExecuteCommand",  
              "ssm:StartSession",  
              "ecs:DescribeTasks"  
          ],  
          "Resource": "*"  
      }  
  ]  
} 
以下のコマンドでタスクをサービスに対するECS Execが有効化どうか確認
%aws ecs describe-services \
--cluster クラスター名 \
--services サービス名 | grep enableExecuteCommand
"enableExecuteCommand": true であれば OK

trueでない場合は、trueにする以下のコマンドを実行
%aws ecs update-service \
--cluster クラスター名 \
--service サービス名 \
--enable-execute-command 

変更した場合は、fargateを再起動する必要があります。
               図 B タスクの再起動
%aws ecs list-tasks --cluster クラスター名 --query "taskArns[]" --output text
arn:aws:ecs:ap-northeast-1:123456789012:task/xxxxx-cluster/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

%aws ecs describe-tasks --cluster クラスター名 --tasks  上記コマンドで出力されたタスク名  --query "tasks[].containers[].name" --output text
%aws ecs execute-command --cluster クラスター名 \
    --task タスク名 \
    --container コンテナ名 \
    --interactive \
    --command "/bin/bash" \
              図C fargateにログイン
fargateにログインできました。コマンド一発とはならないですが、目的は達成!
docker container exec -it コンテナ名 bash と同じことができました。
何故、fargateにログインしたかったか?
コンテナ(今回はRedmine)のデータベース環境database.yml、mail送信環境のconfigration.ymlの中身を確認したかったからです。

社内歩数大会

こんにちは!株式会社オプトプランニングです。
今日は、今期の歩数大会の結果を報告します。

当社は、社員全員の健康維持のため、毎年、「歩数大会」というものを催しています。
体格も性別も年齢も異なりますが、とにかく歩いて歩数をカウントするというもの。一番多く歩いた人が優勝です!そして、1年間の結果を集計し、上位3名が毎年表彰されます。

今期の結果、上位5名の実績です。

1位:4,342,726 歩
2位:3,186,334 歩 
3位:3,124,432 歩
4位:3,025,440 歩
5位:3,022,698 歩

1位の社員は、1日約12,000歩
2位の社員は、1日約 8,800歩 歩いていることになります。

年々、ヒートアップしています。
さて来年は、誰が優勝するでしょうか?!

EC2インスタンスの停止保護(無効化/有効化)をAWS CLIとプログラム(Python)で実行してみる

EC2インスタンスの停止保護無効化、有効化をAWS CLIとpythonで実行してみる
              図A AWS 構成図
    aws ec2 modify-instance-attribute \
        --instance-id i-xxxxxxxxxxyyyyyyy \
        --no-disable-api-stop
                 図Bインスタンスの停止保護(AWSコンソール)
    aws ec2 modify-instance-attribute \
        --instance-id i-xxxxxxxxxxyyyyyyy \
        --disable-api-stop
                  図C インスタンスの停止保護(AWSコンソール)
    #!/usr/bin/python3.8
    import sys
    import boto3
    import botocore
    import os
    import traceback
    def get_abc():
            try:
                    client = boto3.client('ec2')
                    response = client.modify_instance_attribute(
                    InstanceId='i-xxxxxxxxxxxyyyyyy',
                    DisableApiStop={
                            'Value': False,
                    },
                    )
                    return(response)
            except Exception as ex:
                    err_message = ex.__class__.__name__
                    t = traceback.format_exception_only(type(ex), ex)
                    print(t,err_message)
                    sys.exit(1)
    
    if __name__ == '__main__':
            response = get_abc()
            print('status=',response['ResponseMetadata']['HTTPStatusCode'])
            print('date',response['ResponseMetadata']['HTTPHeaders']['date'])
            print('server=',response['ResponseMetadata']['HTTPHeaders']['server'])
    boto3を最新にupdateしないと、エラーになることがあります。
    pip3 install -U boto3 
    2023/12/07時点では boto3-1.33.8 のようです
    status= 200
    date Thu, 07 Dec 2023 04:56:22 GMT
    server= AmazonEC2
    response(実行結果)はdictで返却されます。HTTPStatusCode=200が返却されれば
    成功です。HTTPStatusCode,date,serverを出力しています。
    停止保護有効化したインスタンスを停止させようとすると、エラーになります。
    "botocore.exceptions.ClientError: An error occurred (OperationNotPermitted) when calling the StopInstances operation: The instance 'i-xxxxxxxxxyyyyy' may not be stopped. Modify its 'disableApiStop' instance attribute and try again.\n"] ClientError