AWS

Page content

さあ AWS 使ってみよー。

API access

curlでやろうとするとめちゃ大変そうなので、普通は AWS SDK や AWS CLI を使おうね。(参考: もしもAWSのキーは分かっているけどcurlしか使えない状況でEC2をStopする必要が出た時のために )

共通設定

  • アクセスキーの準備: https://aws.amazon.com/jp/developers/access-keys/
  • 開発用の AWS 認証情報とリージョンのセットアップ: ~/.aws/ 配下に認証や設定情報を置く。 AWS SDK も CLI も使うやつ。コードにべた書きよりは、こういうところに置いたほうが良い。ほか環境変数として読ませる方法もあるので .bashrc に書くなどもまああるでしょう。 (参考: https://docs.aws.amazon.com/ja_jp/sdk-for-java/v1/developer-guide/setup-credentials.html)
    • ~/.aws/credentials: 何より大事な認証情報。 profile を分けて列記することができます。

      [default]
      aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
      aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
      
      [private_developer1]
      aws_access_key_id = aaaaaaaaaaaaaaaaaaaa
      aws_secret_access_key = bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
      
    • ~/.aws/config: credentials に一緒に書いても動くが、 credentials をあまり触りたくなければこうやって分けるのも有り。設定できる項目は色々ありそうだけど未調査。

      [default]
      region = ap-southeast-2
      output = json
      
      [private_developer1]
      region = ap-northeast-1
      

AWS SDK (for Ruby)

ruby を例にやってみる。

  • まずは Gem のインストール

    $ echo "gem 'aws-sdk', '~>3.0.1'" >> Gemfile
    $ bundle install --path=.bundle
    
  • CloudWatch Logs のストリーム一覧を参照をするには、以下のスクリプト。

        require 'aws-sdk'
        require 'pp'
    
        ### get log_streams
        cw_client = Aws::CloudWatchLogs::Client.new(profile: 'private_developer1') # これで認証・リージョン情報を一発で切替えられる。明示しなければ default. もしくはキーやリージョンを1つずつ指定することもできます。
        condition = {
        log_group_name: '/aws/lambda/myFunction',
        order_by: 'LastEventTime',
        descending: true,
        limit: 3
        }
        resp = cw_client.describe_log_streams(condition)
        pp resp
    

    出力の例:

    $ bundle exec ruby log.rb
    
    #<struct Aws::CloudWatchLogs::Types::DescribeLogStreamsResponse
    log_streams=
        [#<struct Aws::CloudWatchLogs::Types::LogStream
        log_stream_name="2018/04/07/[$LATEST]24b194f210d745f392eff39b3e065692",
        creation_time=1523072480976,
        first_event_timestamp=1523072481197,
        last_event_timestamp=1523072481297,
        last_ingestion_time=1523072496405,
        upload_sequence_token=
        "49583088293918636945724255794924900074886787019464277122",
        arn=
        "arn:aws:logs:ap-northeast-1:7..........7:log-group:/aws/lambda/myFunction:log-stream:2018/04/07/[$LATEST]24b194f210d745f392eff39b3e065692",
        stored_bytes=0>,
        #<struct Aws::CloudWatchLogs::Types::LogStream
        log_stream_name="2018/03/14/[$LATEST]f967968c85fa45f694e318ca7ecfd747",
        creation_time=1521033900704,
        first_event_timestamp=1521033900840,
        last_event_timestamp=1521033934040,
        last_ingestion_time=1521033949215,
        upload_sequence_token=
        "49580220378413080199404320187250123504351385670314383698",
        arn=
        "arn:aws:logs:ap-northeast-1:7..........7:log-group:/aws/lambda/myFunction:log-stream:2018/03/14/[$LATEST]f967968c85fa45f694e318ca7ecfd747",
        stored_bytes=746>],
    next_token=
        "Kwfr0bfVKkYk4OrYazFRiRWUd07-P_.........Yezib7GrQ">
    
  • 詳細の使い方は、 AWS公式のsdk documentation を参照

  • なお、 CloudWatchLogs のフィルタと検索をするには filter_log_events を使うんだけど、検索パターンの構文はこちら: https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html

API Gateway

API Gateway timeout にもっと注意!

  • Lambda、Lambda プロキシ、HTTP、HTTP プロキシ、AWS 統合など、すべての統合タイプで 50 ミリ秒〜29 秒, デフォルト29秒 orz orz orz

APIGW のログ出力設定

  1. Create a new IAM role (for example, apigateway-cloudwatch-logs-role) with trust policy apigateway.amazonaws.com
  2. Attach aws exist policy AmazonAPIGatewayPushToCloudWatchLogs to this role
  3. Record this IAM role’s ARN
  4. Add this iam role’s arn to apigatewa-> settings -> CloudWatch log role ARN*
  5. serverless.yml で書く