カテゴリー: aws

AWSの情報をまとめる

  • AWS SQS互換アプリを使ってDockerで検証する

    AWS SQS互換アプリを使ってDockerで検証する

    tl;dr;

    AWS SQSを使ったシステムを作る際、ローカル環境で手軽にSQSがいじれれば非常に便利だ。今回、Dockerを用いてSQS互換の環境を作った。
    docker imageの作り方、localでの起動方法までまとめている。

    docker image作成

    SQSのinterfaceに適合したアプリケーションがある。

    https://github.com/softwaremill/elasticmq

    これをそのままDockerの中に入れ、ポートを開いて`ENTRYPOINT`を起動すれば、SQS互換のdocker imageを作成することができる。

    FROM java:8
    
    ADD https://s3-eu-west-1.amazonaws.com/softwaremill-public/elasticmq-server-0.15.3.jar /elasticmq/elasticmq-server-0.15.3.jar
    EXPOSE 9324
    ENTRYPOINT ["java","-jar","/elasticmq/elasticmq-server-0.15.3.jar"]

    ビルド方法はこちら。

    `docker build -t tsukada/elasticmq:0.15.3 .`

    そのimageを用いて起動する。ローカルの9324 portがコンテナ内の9324 portにそのままマッピングさせた。

    `docker run -d –name=elasticmq -p 9324:9324 tsukada/elasticmq:0.15.3`

    起動確認

    % docker ps
    CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
    cb1023027390        tsukada/elasticmq:0.15.3   "java -jar /elasticm…"   3 seconds ago       Up 2 seconds        0.0.0.0:9324->9324/tcp   elasticmq

    起動成功。localhost の 9324 portとのマッピングも成功した。

    使い方

    キューの作成

    aws sqs create-queue --queue-name test --endpoint-url http://localhost:9324
    
    {
        "QueueUrl": "http://localhost:9324/queue/test"
    }

    ここで表示される`QueueUrl`が、メッセージの送受信などで必須情報となる。

    メッセージ送信

    作成したキューにメッセージを送信する。

    `–queue-url` オプションが必要になる。ここではキューを作成した際に作られた`QueueUrl`を入力する。

    aws sqs send-message --queue-url http://localhost:9324/queue/test --message-body 'tsukada hoge. Hello world' --endpoint-url http://localhost:9324
    
    
    {
        "MD5OfMessageBody": "c5ec7b6e06ad8b6faf949efb02e2f406", 
        "MessageId": "83a36e5f-1d40-4da8-84eb-b37a8c864541"
    }

    送信が成功すると、メッセージ本文の MD5 ダイジェストとメッセージ ID が表示される。

    メッセージを受信する

    aws sqs receive-message --queue-url http://localhost:9324/queue/test --endpoint-url http://localhost:9324
    
    {
        "Messages": [
            {
                "Body": "tsukada hoge. Hello world ", 
                "ReceiptHandle": "83a36e5f-1d40-4da8-84eb-b37a8c864541#58efa4b9-8fe9-4324-aded-08b72253be1c", 
                "MD5OfBody": "c5ec7b6e06ad8b6faf949efb02e2f406", 
                "MessageId": "83a36e5f-1d40-4da8-84eb-b37a8c864541"
            }
        ]
    }

    メッセージで送信された

    tsukada hoge. Hello world

    を確認できた。
    ちなみに、このコマンドを複数回実行しても、毎回メッセージが表示されるわけではない。

    SQSには可視性タイムアウトという考えがあり、デフォルトで1度キューを表示したら、30秒間は表示されない。

    この仕組みで、重複してキューが実行されるのを防いでいる。

    そのような仕様だと、「見えているキュー、見えてないキュー」の件数を確認したくなる。

    見ているキュー、見えていないキューの件数を確認したい

     見えているキュー(キューから取得可能なメッセージのおおよその数)

    `ApproximateNumberOfMessages` が見えている件数

    aws sqs get-queue-attributes --endpoint-url http://localhost:9324 --queue-url http://localhost:9324/queue/test --attribute-names ApproximateNumberOfMessages
    {
        "Attributes": {
            "ApproximateNumberOfMessages": "1"
        }
    }

    見えてないキュー(処理されたメッセージ)

    `ApproximateNumberOfMessagesNotVisible`を `–attribute-names`に指定することで見えなくなっているキューの件数を表示することができる。

    aws sqs get-queue-attributes --endpoint-url http://localhost:9324 --queue-url http://localhost:9324/queue/test --attribute-names ApproximateNumberOfMessagesNotVisible
    {
        "Attributes": {
            "ApproximateNumberOfMessagesNotVisible": "0"
        }
    }

    これらのオプションについては公式ドキュメントで綺麗に整理されている。

    https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-resources-required-process-messages.html

    メッセージを削除する

    不要になったメッセージは削除した方が良い。削除コマンドは以下の通り。

    aws sqs delete-message  --endpoint-url http://localhost:9324 --queue-url http://localhost:9324/queue/test --receipt-handle "****"

    `–receipt-handle` には、メッセージを受信した際に記載されている`ReceiptHandle`を指定する。

    receive-message (メッセージを受信)した際、した際に確認できる ReceiptHandle はこのような感じに表示される。`.jq` コマンドなどを利用すれば簡単にシェル化できそうだ。

    QueueUrlsを確認する

    QueueUrlsを確認できるのはもちろんキュー作成時だけではなく、確認用のコマンドも用意されている。

    aws sqs list-queues --endpoint-url http://localhost:9324
    {
        "QueueUrls": [
            "http://localhost:9324/queue/test"
        ]
    }

    参考情報

    https://qiita.com/tsukapah/items/0ba64ac734e885f6e8e8

    https://qiita.com/tcsh/items/7781fe238df82fc030d2

    参考情報

    AWSについて体系的に学ぶことができるのでおすすめ。

  • 手動で作った lambda を code として管理する

    手動で作った lambda を code として管理する

    tl;dr;

    既存の lambda をダウンロードし、コンソールを使わず sam を用いて管理する方法をまとめた。deploy 方法から注意事項までを記載。

    既存 lambda をダウンロード

     lambda をダウンロードすると大きく2つに分けてダウンロードすることができる。

    sam のドキュメントについてはこちら

    関数のエクスポートを押下すると、

     

    • AWS SAM ファイルのダウンロード
    • デプロイパッケージのダウンロード

    が選択できる。

    端的に言うと

    • lambda の設定ファイル
    • プログラムのコード

    だ。両方ダウンロードする。

    sam のセットアップ

    公式ドキュメントの手順を準拠すると、 sam のインストールは以下の通りとなる。

    brew tap aws/tap
    brew install aws-sam-cli

    deploy ディレクトリの初期化

    今回は python3.8 を利用するので以下のように設定した。
    ダウンロードした zipファイル は unzipコマンドなどで解凍しておく。

    sam init
    
    
    	SAM CLI now collects telemetry to better understand customer needs.
    
    	You can OPT OUT and disable telemetry collection by setting the
    	environment variable SAM_CLI_TELEMETRY=0 in your shell.
    	Thanks for your help!
    
    	Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html
    
    Which template source would you like to use?
    	1 - AWS Quick Start Templates
    	2 - Custom Template Location
    Choice: 1
    
    Which runtime would you like to use?
    	1 - nodejs12.x
    	2 - python3.8
    	3 - ruby2.5
    	4 - go1.x
    	5 - java11
    	6 - dotnetcore2.1
    	7 - nodejs10.x
    	8 - nodejs8.10
    	9 - python3.7
    	10 - python3.6
    	11 - python2.7
    	12 - java8
    	13 - dotnetcore2.0
    	14 - dotnetcore1.0
    Runtime: 2
    
    Project name [sam-app]: 
    
    Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git
    
    AWS quick start application templates:
    	1 - Hello World Example
    	2 - EventBridge Hello World
    	3 - EventBridge App from scratch (100+ Event Schemas)
    Template selection: 1
    
    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Runtime: python3.8
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    
    Next steps can be found in the README file at ./sam-app/README.md
        
    coco@darkenagy sam % 

    ダウンロードした yamlファイル を、 template.yml と言うファイル名に変更する。

    mv test-imagemagick.yaml template.yml 

    requirements.txt も必要になるので、作成する。使わない場合でも空のファイルを用意する必要があるので、 touch するなり作成する。

    touch requirements.txt

    以下のように表示されれば成功。

    sam build
    Building resource 'testimagemagick'
    Running PythonPipBuilder:ResolveDependencies
    Running PythonPipBuilder:CopySource
    
    Build Succeeded
    
    Built Artifacts  : .aws-sam/build
    Built Template   : .aws-sam/build/template.yaml
    
    Commands you can use next
    =========================
    [*] Invoke Function: sam local invoke
    [*] Deploy: sam deploy --guided
        

    ちなみに、sam コマンドでも、.aws 配下の profile を読み込むことも可能。

    `sam build –profile cloudformation` 

    エラーが発生した場合は debugモード で確認することができる。

    sam build --debug

    あとは invoke するなり、deploy するなりすればよい。

    deploy

    `sam deploy –guided`コマンドを利用することで deploy が可能。

    % sam deploy --guided
    
    Configuring SAM deploy
    ======================
    
    	Looking for samconfig.toml :  Not found
    
    	Setting default arguments for 'sam deploy'
    	=========================================
    	Stack Name [sam-app]: 
    	AWS Region [us-east-1]: ap-northeast-1
    	#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
    	Confirm changes before deploy [y/N]: y
    	#SAM needs permission to be able to create roles to connect to the resources in your template
    	Allow SAM CLI IAM role creation [Y/n]: y
    	Save arguments to samconfig.toml [Y/n]: y
    
    	Looking for resources needed for deployment: Found!
    
    		Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-1dc492sz2bqu7
    		A different default S3 bucket can be set in samconfig.toml
    
    	Saved arguments to config file
    	Running 'sam deploy' for future deployments will use the parameters saved above.
    	The above parameters can be changed by modifying samconfig.toml
    	Learn more about samconfig.toml syntax at 
    	https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html
    
    	Deploying with following values
    	===============================
    	Stack name                 : sam-app
    	Region                     : ap-northeast-1
    	Confirm changeset          : True
    	Deployment s3 bucket       : aws-sam-cli-managed-default-samclisourcebucket-1dc492sz2bqu7
    	Capabilities               : ["CAPABILITY_IAM"]
    	Parameter overrides        : {}
    
    Initiating deployment
    =====================
    Uploading to sam-app/9a97ece5eb5fac3dd9dff84a97110722  9611 / 9611.0  (100.00%)
    Uploading to sam-app/cac8e2252620a466ff8e4becb2d4a8ed.template  638 / 638.0  (100.00%)
    
    Waiting for changeset to be created..
    
    CloudFormation stack changeset
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Operation                                                           LogicalResourceId                                                   ResourceType                                                      
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    + Add                                                               testimagemagick                                                     AWS::Lambda::Function                                             
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    Changeset created successfully. arn:aws:cloudformation:ap-northeast-1:821594579130:changeSet/samcli-deploy1578156109/01d374f5-800c-438e-b4cb-4f25d8d0bc4d
    
    
    Previewing CloudFormation changeset before deployment
    ======================================================
    Deploy this changeset? [y/N]:

    問題なければyを押す。

    2020-01-05 01:42:01 - Waiting for stack create/update to complete
    
    CloudFormation events from changeset
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ResourceStatus                                     ResourceType                                       LogicalResourceId                                  ResourceStatusReason                             
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    CREATE_IN_PROGRESS                                 AWS::Lambda::Function                              testimagemagick                                    -                                                
    CREATE_IN_PROGRESS                                 AWS::Lambda::Function                              testimagemagick                                    Resource creation Initiated                      
    CREATE_COMPLETE                                    AWS::Lambda::Function                              testimagemagick                                    -                                                
    CREATE_COMPLETE                                    AWS::CloudFormation::Stack                         sam-app                                            -                                                
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    Successfully created/updated stack - sam-app in ap-northeast-1
    

    確認

    成功すれば以下の通り作成される。

    function name が、意図した名前と違う場合、明示的に指定することができる。

    AWSTemplateFormatVersion: '2010-09-09'
    Transform: 'AWS::Serverless-2016-10-31'
    Description: An AWS Serverless Specification template describing your function.
    Resources:
      testimagemagick:
        Type: 'AWS::Serverless::Function'
        Properties:
          FunctionName: test-imagemagick-123
          Handler: lambda_function.lambda_handler
          Runtime: python3.8
          CodeUri: .
          Description: ''
          MemorySize: 128
          Timeout: 3
          Role: 'arn:aws:iam::123:role/lambdaExecution'
          Layers:
            - 'arn:aws:lambda:ap-northeast-1:123:layer:image-magick:2'

    template.yml で`FunctionName`を指定する。

    再度`sam build`、 `sam deploy` を行うと、新しい lambda function に置き換わる。

    注意点

    手動で作り上げた lambda を sam を用いて上書いて管理することはできないのか。
    結論、そのままはできない。

    現在自分が動かしているものについては、手動で作った lambda は削除し、その後 sam を用いたdepoloy に切替えるなどして対応している。

     

    https://dev.classmethod.jp/cloud/aws/cloudformation-import-existing-resources/

     

    しかし、CloudForomation で手動で作成したリソースをインポートできるようになったので、これを使えばできるかも。(未確認)

    試したことある人いたら twitter でもご一報ください。

     

  • AWS lambda(Python 3.8)でimagemagickを使う

    AWS lambda(Python 3.8)でimagemagickを使う

    tl;dr;

    AWS lambda(Python 3.8)で画像処理ツールのimagemagickを動かした。

    install方法からlambda内でimagemagickの動かす際のコードまでを紹介。

    imagemagickとは

    imagemagick は動的に画像を編集する古典的なツール。こちらの記事によると、なんと1987年から開発されている。wikipediaを確認する限り、Photoshopのリリースが1990年だから、その古さに驚かされる。

    しかしこのツール、度重なる脆弱性は報告されているものの、画像編集の機能としてまだまだ現役として使っているプロジェクトも存在する。

    今回はそのimagemagickをlambdaで。Python 3.8のランタイムから使う方法を紹介する。

    Serverless.Pub

    ありがたい事にServerlessを支援し積極的に情報発信をしてくれている団体がいる。

    彼らが作ったlambdaの`binally layer`をCloudFormationでdeployする機能も提供してくれている。

    https://serverless.pub/lambda-utility-layers/

    GitHubはこちら

    https://github.com/serverlesspub/imagemagick-aws-lambda-2

    こちらを`git clone`して、`make all` すればimagemagickのlambdaの`binally layer`ができる。

    その方法を使ってもよいのだが、
    実は以下のページからDeployボタンを押せば、それだけで自動でCloudFormationが自分のAWSで動き、lambdaの中に`binally layer`が作成されることもできる。

    https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:145266761615:applications~image-magick-lambda-layer

    しかし、注意すべきはここの部分。

    要約すると、nodejs10.xランタイムのようなAmazon Linux 2で使えるよ。とのこと。PythonのPの字も見当たらない。
    対象外かと思い当初諦めていた。

    そんな中、最近、`Python 3.8`ランタイムがlambdaで使えるようになった事を知り、公式ドキュメントを読んでみると、今までのPythonで使っていたOSとは異なり、`Amazon linux2`がベースとなっていることがわかった。

    node.jsに絞っているのはAmazonLinux2がベースのように見受けられたため、これはlambdaの中でPythonでもimagemagickを動かせるかもと思い今回試す事にした。

    やってみた

    https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:145266761615:applications~image-magick-lambda-layer

    を開きDeployボタンを押す。
    しかし、この時点でいきなりDeployされるわけではない。

    DeployはCloudFormationによって行われる。CloudFormationのスタック名確定させたら(デフォルトでもよい)デプロイを押下。

    しばらくすると、AWS LambdaのLayersに新たに`image-magick`が登録される。

    Lambda関数から、Layersを選択する

    レイヤーの追加ボタンを押し、imagemagickを選択する。

    レイヤーに表示されない場合は、以下のようにARNを直接入力する。

    これで下準備は完了

    AWS lambda(Python 3.8)でimagemagickを使う

     ここからがPythonからimagemagickを使えるかの確認。

    今回はシンプルにversionを表示させることで使える事にしたい。

    コードはこちら。

    import json
    import subprocess
    
    def lambda_handler(event, context):
        subprocess.check_call(['convert', '-version'])
      
        return {
            'body': json.dumps('Hello from Lambda!')
        }
    

    subprocessを使って、Pythonから、lambdaが動いているOS側のコマンドを実行する。

    imagemagickをinstallすると使えるようになる`convert`コマンドを叩く。

     

    結果は以下の通り

    無事imagemagickのversionを確認できた。

    最後に

    私が実施した際はレイヤーの追加ボタンを押しても選択肢としてimagemagickが表示されなかった。

    これは、CloudFormationによって作られるimagemagickのレイヤーがnode.jsに限定しているため。不便なのでpull reqを出してmergeしてもらった。

    https://github.com/serverlesspub/imagemagick-aws-lambda-2/pull/18/files

    今はレイヤー選択画面から互換性のあるレイヤーとして選択できるはずだ。

     

  • ERROR: boto3 1.9.226 has requirement botocore=1.12.226, but you’ll have botocore 1.13.37 which is incompatible.

    ERROR: boto3 1.9.226 has requirement botocore<1.13.0,>=1.12.226, but you’ll have botocore 1.13.37 which is incompatible.

    TL;DR

    awsコマンドを実施中に遭遇。versionが求められているものと違うようだ。

    Encountered while executing aws command. The version seems different from what is required.

    ERROR: boto3 1.9.226 has requirement botocore<1.13.0,>=1.12.226, but you'll have botocore 1.13.37 which is incompatible.
    

    対処 deal

    awscliを最新にする

    Update awscli

    pip3 install awscli --upgrade --user

     

    その後、botocore、boto3をuninstall

    Then uninstall botocore, boto3

    pip3 uninstall botocore
    
    pip3 uninstall boto3

     

    再度botocore、boto3をinstall

    Install botocore and boto3 again

    pip3 install botocore
    
    pip3 install boto3

     

    以上。

    That’s it.

    参考情報 FYI

    https://stackoverflow.com/questions/51911075/how-to-check-awscli-and-compatible-botocore-package-is-installed

     

     

  • Amazon Transcribe が日本語に対応したので早速試した

    Amazon Transcribe が日本語に対応したので早速試した

    はじめに

    11/22 Amazon Transcribe が日本語に対応したという記事がリリースされました。

    https://aws.amazon.com/jp/about-aws/whats-new/2019/11/amazon-transcribe-now-supports-speech-to-text-in-7-additional-languages/

    議事録とったりVoice memo作ったり何かと活用の場所がある機能。早速試してみました。

    音声ファイルの準備

    今回はiPhoneのボイスメモを利用することにします。アプリを消してしまった人もいると思うので念の為リンクを貼ります。

    https://itunes.apple.com/jp/app/%E3%83%9C%E3%82%A4%E3%82%B9%E3%83%A1%E3%83%A2/id1069512134?mt=8

    このアプリで録音した音声ファイルはm4aフォーマットになっているので、wavフォーマットに変換します。

    macでは標準で付属しているafconvertというソフトを使う事で手軽に変換できます。

    afconvert -f WAVE -d LEI16 sample.m4a sample.wav

    音声ファイルのアップロード

    解析対象の音源をs3に置く必要があり、作業用にバケットを作ります。

    名前は今回以下のバケット名にしました。

    今回は全部デフォルトでポチポチと進ませバケットを作成しました。

    作成されたバケットに変換後の音源をupload。

    ここまでで準備は完了です。
    Amazon Transcribeを開き、Create jobを押し、文字起こしのジョブを登録します。

    今回は以下の通り設定することにします。
    Languageを今回追加されたJapaneseを指定することを忘れないでください。

    inport dataは、S3に置いた音源のパスを。
    Formatは変換後のフォーマットであるwavとしました。

    Output dataでいくつか指定できますが、特に役立ちそうな機能はAlternative resultsです。
    今回はこれを有効にして進めることにします。

    createを押します。

    無事登録されたようです。

    詳細情報を確認すると、StatusはIn progressになりました。暫くすると処理が始まりました。

    Transcriotion previewに、ちゃんと文字として表示されました。漢数字なのがちょっと読みづらいですね。

    結果

    jsonファイルで出力されます。
    start_time, end_timeが表示され、実際どの部分が文字起こしされたのか非常にわかりやすいと感じました。

    単語ごとにconfidenceが表示され、どれだけ的確かの指標にすることができるようです。

      "results": {
        "transcripts": [
          {
            "transcript": "今日 は 二 千 十 九 年 六月 十 一 日 です"
          }
        ],
        "items": [
          {
            "start_time": "0.84",
            "end_time": "1.27",
            "alternatives": [
              {
                "confidence": "0.9588",
                "content": "今日"
              }
            ],
            "type": "pronunciation"
          },
          {
            "start_time": "1.27",
            "end_time": "1.4",
            "alternatives": [
              {
                "confidence": "1.0",
                "content": "は"
              }
            ],
            "type": "pronunciation"
          },

    まとめ

    GoogleにもGoogle Speech APIという似たような機能があるがそちらは、今回のAWSはほとんどブラウザのみで完結できるので非エンジニアでも比較的簡単に利用することができそうです。

    今回文字起こししたのはシンプルな言葉だったけど、長文を文字起こしした際、どれだけ読みやすいかなどは注視したいと思います。

    参考情報

    GCPで似たような機能があり、それは以前実施した。

    https://tsukada.sumito.jp/2019/06/11/google-speech-api-japanese/

     

     

     

     

     

  • dockerをECSで動かした時のdebug方法について

    dockerをECSで動かした時のdebug方法について

    はじめに

    dockerコンテナを動かしていると、何らかの原因で起動シェルが止まってしまうことがある。今回はその調査方法の一つ、ECS用にAWSからオフィシャルのログ収集ツール ECSログコレクター が提供されているので、今回はそれを紹介。

    インストール方法

    AWS公式サイトにある通り、ツールを取得する

    $ curl -O https://raw.githubusercontent.com/awslabs/ecs-logs-collector/master/ecs-logs-collector.sh

    その後、sudoをつけてシェルを実行する

    $ sudo bash ./ecs-logs-collector.sh

    しばらくすると、諸々ログが取れる

    $ sudo bash ./ecs-logs-collector.sh
    Trying to check if the script is running as root ... ok
    Trying to resolve instance-id ... ok
    Trying to collect system information ... ok
    Trying to check disk space usage ... ok
    Trying to collect common operating system logs ... ok
    Trying to collect kernel logs ... ok
    Trying to get mount points and volume information ... ok
    Trying to check SELinux status ... ok
    Trying to get iptables list ... ok
    Trying to detect installed packages ... ok
    Trying to detect active system services list ... ok
    Trying to gather Docker daemon information ... ok
    Trying to inspect all Docker containers ... ok
    Trying to collect Docker daemon logs ... ok
    Trying to collect Amazon ECS Container Agent logs ... ok
    Trying to collect Amazon ECS Container Agent state and config ... ok
    Trying to collect Amazon ECS Container Agent engine data ... ok
    Trying to archive gathered log information ... ok

    無事完了すると、correctというディレクトリが作られ、ログが集約される。

    $ ls -ltr
    合計 236
    -rw-rw-r-- 1 ec2-user ec2-user  14181  7月 19 14:25 ecs-logs-collector.sh
    drwxr-xr-x 3 root     root       4096  7月 19 14:25 collect
    -rw-r--r-- 1 root     root     219653  7月 19 14:26 collect-i-0051ca9951de8e82a.tgz

    dockerの状態を確認するには、correct、インスタンスid、配下のdockerディレクトリにログとして出力される。

    /collect/i-xxxxxxxxx/docker

    ざっと見てみると、

    [
        {
            "Id": "xxxxxxx",
            "Created": "2019-07-19T12:36:48.665852002Z",
            "Path": "sh",
            "Args": [
                "/root/bin/execute.sh"
            ],
            "State": {
                "Status": "exited",
                "Running": false,
                "Paused": false,
                "Restarting": false,
                "OOMKilled": true,
                "Dead": false,
                "Pid": 0,
                "ExitCode": 137,
                "Error": "",
                "StartedAt": "2019-07-19T12:36:49.47823385Z",
                "FinishedAt": "2019-07-19T13:12:07.097787961Z"
            },

    終了したときの状態がわかる。

    OOMKilledがtrueになっており、このコンテナはメモリを使い果たし、OOMKillerが発動、コンテナがkillされたのではと推測が立つ。

    linuxのimageをbaseに使っていると、当然メモリーを使い切った際にはOOM killerなどは発生する。その際の原因調査をする上では、サーバレスのfargateよりは、まだホストにログインできるECSの方が原因調査はやりやすい。

    それ以外にも非常に細かい状態を確認することができる。

                "DnsOptions": null,
                "DnsSearch": null,
                "ExtraHosts": null,
                "GroupAdd": null,
                "IpcMode": "shareable",
                "Cgroup": "",
                "Links": null,
                "OomScoreAdj": 0,
                "PidMode": "",
                "Privileged": false,
                "PublishAllPorts": false,
                "ReadonlyRootfs": false,
                "SecurityOpt": null,
                "UTSMode": "",
                "UsernsMode": "",
                "ShmSize": 67108864,
                "Runtime": "runc",
                "ConsoleSize": [
                    0,
                    0
                ],
                "Isolation": "",
                "CpuShares": 2,
                "Memory": 2147483648,
                "NanoCpus": 0,
                "CgroupParent": "/ecs/ad627055-dc5b-4903-96ed-be9e0f25cf33",
                "BlkioWeight": 0,
                "BlkioWeightDevice": null,
                "BlkioDeviceReadBps": null,
                "BlkioDeviceWriteBps": null,
                "BlkioDeviceReadIOps": null,
                "BlkioDeviceWriteIOps": null,
                "CpuPeriod": 0,
                "CpuQuota": 0,
                "CpuRealtimePeriod": 0,
                "CpuRealtimeRuntime": 0,
                "CpusetCpus": "",
                "CpusetMems": "",
                "Devices": null,
                "DeviceCgroupRules": null,
                "DiskQuota": 0,
                "KernelMemory": 0,
                "MemoryReservation": 1073741824,
                "MemorySwap": 4294967296,
                "MemorySwappiness": null,
                "OomKillDisable": false,
                "PidsLimit": 0,
                "Ulimits": [
                    {
                        "Name": "cpu",
                        "Hard": 0,
                        "Soft": 0
                    },
                    {
                        "Name": "nofile",
                        "Hard": 4096,
                        "Soft": 1024
                    }
                ],
                "CpuCount": 0,
                "CpuPercent": 0,
                "IOMaximumIOps": 0,
                "IOMaximumBandwidth": 0,
                "MaskedPaths": [
                    "/proc/acpi",
                    "/proc/kcore",
                    "/proc/keys",
                    "/proc/latency_stats",
                    "/proc/timer_list",
                    "/proc/timer_stats",
                    "/proc/sched_debug",
                    "/proc/scsi",
                    "/sys/firmware"
                ],

    詳細はこちら。

    https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-logs-collector.html

    では、今日はこの辺で。

     

     

  • Error getting valid credentials (AKID ): NoCredentialProviders: no valid providers in chain. Deprecated.

    Error getting valid credentials (AKID ): NoCredentialProviders: no valid providers in chain. Deprecated.

    はじめに

    ECSでコンテナを動かそうとすると、作成されるEC2でdocker logsに

    2019-07-08T12:17:52Z [INFO] Event stream ContainerChange start listening...
    2019-07-08T12:17:52Z [WARN] Error getting valid credentials (AKID ): NoCredentialProviders: no valid providers in chain. Deprecated.
    	For verbose messaging see aws.Config.CredentialsChainVerboseErrors
    2019-07-08T12:17:52Z [INFO] Registering Instance with ECS
    2019-07-08T12:17:52Z [INFO] Remaining mem: 3885
    2019-07-08T12:17:52Z [ERROR] Unable to register as a container instance with ECS: NoCredentialProviders: no valid providers in chain. Deprecated.
    	For verbose messaging see aws.Config.CredentialsChainVerboseErrors
    2019-07-08T12:17:52Z [ERROR] Error registering: NoCredentialProviders: no valid providers in chain. Deprecated.
    	For verbose messaging see aws.Config.CredentialsChainVerboseErrors

    というエラーが記述された。その原因と対策を明記する。

    原因

    ecsを実行するEC2インスタンスのroleに適切な権限がない。

    roleに以下の通り権限を付与する

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ecs:CreateCluster",
                    "ecs:DeregisterContainerInstance",
                    "ecs:DiscoverPollEndpoint",
                    "ecs:Poll",
                    "ecs:RegisterContainerInstance",
                    "ecs:StartTelemetrySession",
                    "ecs:UpdateContainerInstancesState",
                    "ecs:Submit*",
                    "ecr:GetAuthorizationToken",
                    "ecr:BatchCheckLayerAvailability",
                    "ecr:GetDownloadUrlForLayer",
                    "ecr:BatchGetImage",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": "*"
            }
        ]
    }

     

    もしEC2へattachするroleを変更したい場合は、ECSの画面からではなく、CloudFormationの画面から変更を行う。

    これは、ECSのサービス作成時、裏でCloudFormationが実行されるため。

    具体的な手順はクラメソさんのBlogが非常にわかりやすい。

    https://dev.classmethod.jp/cloud/aws/ecs-change-instance-type/

    変更点は以下の箇所

     

    有効化するには現在起動しているEC2インスタンスをterminateすること。

    オートスケールの設定がされているので、自動で新しい設定のインスタンスが立ち上がる。

     

     

     

     

     

     

  • You must specify a region. You can also configure your region by running “aws configure”.

    You must specify a region. You can also configure your region by running “aws configure”.

    はじめに

    ECSでタスクロールを指定しているのに、ECSで動かしたコンテナ内でawsコマンドを使うと、aws configureをしてくれとエラーが出る際の対処。

    You must specify a region. 
    You can also configure your region by running "aws configure".

    原因

    エラーメッセージの通りregionが指定されていないから。

    コンテナに以下の設定を入れるよう、Dockerfileを修正する。

    [default]
    region=ap-northeast-1
    output=json

     

     

     

  • User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:

    User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:

    はじめに

    API gatewayのテストをしていると、

    “` User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api: “` というエラーが出た。

    原因

    パーミッションエラー

    対処

    API gatewayの許可IPを確認する。

    aws:SourceIpにIPを追加する。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "execute-api:Invoke",
                "Resource": "arn:aws:execute-api:*:*:*/*",
                "Condition": {
                    "IpAddress": {
                        "aws:SourceIp": [
                            "123.0.0.1",
                            "1.23.4.1"
                        ]
                    }
                }
            }
        ]
    }

     

    参考情報

    クラメソさん、いつもありがとうございます。

    https://dev.classmethod.jp/cloud/aws/api-gateway-resource-policy/

     

  • AWS Solutions Architect受験記録

    AWS Solutions Architect受験記録

    はじめに

    AWS ソリューションアーキテクト(アソシエイト)を合格する事ができた。

    振り返りも兼ねて、まとめたいと思う。

    きっかけ

    4月AWS Certified Solutions Architectを取得しようと心に決めた。

    理由は以下の通り。

     

    • 入社以来ずっとインフラチームにいたが、4月からマイクロサービスを推進する別チームを担当することになった。今まで仕事を通じて学んだ事を形にしたかった。
    • インフラチームを離れると言っても、AWSを使わなくなる訳ではない。むしろ、積極的に活用する立場になる。どのような構成で設計していけば良いのか、今回の勉強で新たな視点を得たかった。
    • さらなる運用費削減の構成を学ぶ事で、ランニングコストを削減に貢献したいと思った。
    • 今から作ろうとしているシステムの構成で、ベストプラクティスを学べる事ができるかも。
    • 本試験を通じて得られる知識をチームに還元し、チーム全体のレベルをあげるキッカケが作れるかも。

    勉強前の状態

    仕事を通じ、会社のシステムをAWSへ移行するプロジェクトを担当させていただいた。

    ただし、チームで取り組んだので、自分が全てを担当した訳ではない。

    正直言うと、他のメンバーが担当したところは「そーゆーものなのかー」程度だった。

     

    チーム全員がほぼAWS未経験。2つの国を横断するサーバーをAWSに移行した話。

    このプロジェクトではクラスメソッドさんに数々の有益なアドバイスを戴いた。やっぱクラメソさんすごいよ。

    何の教材を使ってどのくらい勉強したか

    定番の黒本

    勉強時間は10時間程度だったと思う。

    この本が特に役立ったのは、S3のバケットタイプ。

    とりあえずスタンダードやGlacierを使っていたけど、それ以外のタイプはあまり詳しくなかった。

    仕事ではバックアップしたファイルをS3に格納したりしているが、今回得た知識を使って去らなくコストダウンをする事ができそうだ。

    その他、EBS最適化、DynamoDB アクセラレーター、他アカウントとの統合など参考になった。

    問題集

    とにかく隙間時間に勉強したかったので、スマホでも勉強できる教材が欲しかった。ヤフオクに売ってる380問くらい入っているのを買った。

    正直結構難しい、「このレベルが実際の試験の問題なのかも」と思い面喰らった。

    なので、とにかく正解率が9割を超えるくらいやり込んだ。おそらく20時間は費やした。

    しかし、実際の試験ではここまで難しい問題は出なかった。

    Udemy

    UdemyでAWS取得コースがあったので、セール中に買って隙間時間にやったが、小テストがスマホ(私がiPhone 7だからか?)に対応していないようで、小テストの度にPCで行なっていたが、次第に億劫になってしまい、最初の5時間程度やっただけでやらなくなってしまった。しかし、コンテンツ自体はとても良質なので、いい教材だとは思う。

    だけど、自分としてはセミナーをじっくり聞いてテストを解くというよりは、テストを先に解いて分からないところを講義を聞くというスタイルじゃないと、眠くなってしまう体質なので自分にはあわなかった。

    https://www.udemy.com/aws-associate/

    AWS Blackbeltの資料

    おそらく3時間程度。

    EC2,VPC,RDSなど、移行の時に使ったり、日々使っているものについてはザーッと流して読んだ程度。

    逆にKinesisやRedshiftは業務で使っていないので、概要を掴んだ。

    Kinesisのチューニングポイントなど、Blackbeltを目を通すだけでも有益だ。

    勉強のアウトプット

    手前味噌ながらメモをサービス毎に本ブログで書いた。

    自分があらかじめ知っていたところは記載しておらず、知らなかったところ、もしくは理解が乏しいところを読み返すためにまとめた。

    そのため、たった1行の記事もある。。

    https://tsukada.sumito.jp/category/tech/aws/aws-certified-solutions-architect-associate/

    (メモです。間違ってるところあったらごめんなさい、直します)

    実際の試験

    自分があまりに構えすぎていたのもあるかもしれないし、たまたま自分の運が良かっただけかもしれないが、難しい問題はそこまでない。

    問題は日本語でも選べるが、ちゃんと読まないと引っかかってしまうものもある。

    幸い、問題毎に日本語・英語を選べる事ができたので、自分の理解に間違っていないか、日本語・英語の両方で確認した。

    試験時間は130分もある。この確認をしても時間は十分に余った。

    試験後の感想

     

    昔Ciscoの試験やOracleの試験を受けた際は「合格・不合格」の紙はもらえたが、それがなかったので全く実感がわいてない。5営業日にメールで連絡来るらしい。

    また、試験の翌日、AWS認定サイトにログインしたら無事合格証のPDFをダウンロードする事ができた。

     

    参考情報

    AWS Solutions Architectを取得するだけでなく、AWSについて体系的に学ぶことができるのでおすすめ。