ablog

不器用で落着きのない技術者のメモ

AWS Pricing Calculator は1ヶ月を約30.4日(730時間)で算出している

Q: 見積りと実際の請求額が異なるのはなぜですか?
A: AWS Pricing Calculator では、標準の 1 か月あたりのタイムフレームをもとにサービスのコストが計算されます。Calculator では、1 か月は 730 時間 (365 日 * 24 時間 / 1 年につき 12 か月) あることが前提となっています。現在の請求期間によっては実際の時間数は上下することが考えられます。

Calculator のよくある質問

間をとって30.5にしてみると...
$0.016 * 24(h) * 30.5(d) = $11.712
端数切り上げで $11.72 になりました!
正確には30.5ではないかもしれませんが、おおよそ間違いないでしょう。

AWS Simple Monthly Calculator を使っていて気づいたこと | Tagbangers Blog

Aurora PostgreSQL で S3 のファイルのインポート/エクスポートする

Aurora PostgreSQL で S3 のファイルのインポート/エクスポートは aws_s3.table_import_from_s3 、aws_s3.query_export_to_s3 でできる。

ECS の fargate タスクを AWS CLI で停止したメモ

$ aws ecs list-tasks --cluster  fargate-test
$ aws ecs describe-tasks --cluster  fargate-test --tasks arn:aws:ecs:ap-northeast-1:123456789012:task/fargate-test/2db44988c2564237b85bebabc6ac37af
$ curl 172.31.29.36
$ aws ecs stop-task --cluster fargate-test --task arn:aws:ecs:ap-northeast-1:123456789012:task/fargate-test/35c2139a427d499db77a1e87244d6b13

IIS のアクセスログを Amazon Athena でクエリする

#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
  • テーブルを作成する。
CREATE EXTERNAL TABLE `iis_w3c_logs`( 
  date_col string, 
  time_col string, 
  s_ip string,
  cs_method string, 
  cs_uri_stem string, 
  cs_uri_query string,
  s_port string,
  cs_username string,
  c_ip string,
  user_agent string,
  sc_status string,
  sc_substatus string,
  sc_win32_status string,
  time_taken string
  ) 
ROW FORMAT DELIMITED  
  FIELDS TERMINATED BY ' '  
STORED AS INPUTFORMAT  
  'org.apache.hadoop.mapred.TextInputFormat'  
OUTPUTFORMAT  
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION   's3://iis-log/w3c-log/'
  • クエリを実行してみる。
select cs_uri_stem, count(1) as cnt 
FROM "default"."iis_w3c_logs" 
group by cs_uri_stem 
order by cnt desc;
  • Parquet に CTAS する
CREATE TABLE iis_w3c_logs_parquet 
WITH (
     format = 'PARQUET', 
     external_location = 's3://iis-log/accesslog_parquet/'
     ) 
AS select *
FROM iis_w3c_logs;

EC2 で AWS Glue ETL ライブラリを使ってみる

$ cd /opt
$ sudo mkdir apache-spark apache-maven
  • Open JDK 1.8 をインストール
$ sudo yum -y install java-1.8.0-openjdk-devel.x86_64
$ java -version
  • Maven をインストール
$ curl -O https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-common/apache-maven-3.6.0-bin.tar.gz
$ sudo tar zxvf apache-maven-3.6.0-bin.tar.gz -C /opt/apache-maven
  • Spark をインストール
$ curl -O https://aws-glue-etl-artifacts.s3.amazonaws.com/glue-1.0/spark-2.4.3-bin-hadoop2.8.tgz
$ tar zxvf spark-2.4.3-bin-hadoop2.8.tgz -C /opt/apache-spark
  • PATH を設定
$ vi ~/.bash_profile
# 以下を追記
export SPARK_HOME=/opt/spark/spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8
export PATH=/opt/maven/apache-maven-3.6.0/bin:$SPARK_HOME/bin:$PATH
$ source ~/.bash_profile
  • Glue ETL ライブラリをダウンロードする。
$ git clone https://github.com/awslabs/aws-glue-libs.git
  • pom.xml をダウンロード
$ wget https://raw.githubusercontent.com/ktsmy/study-aws-glue/master/pom.xml
  • Spark shell を実行してみる
$ spark-shell
21/02/26 07:06:03 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://ip-172-31-21-108.ap-northeast-1.compute.internal:4040
Spark context available as 'sc' (master = local[*], app id = local-1614323167359).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.3
      /_/

Using Scala version 2.11.12 (OpenJDK 64-Bit Server VM, Java 1.8.0_272)
Type in expressions to have them evaluated.
Type :help for more information.

scala> :q
  • pyenv をインストール
$ sudo yum -y install git \
  bzip2 \
  bzip2-devel \
  gcc \
  git \
  libffi-devel \
  make \
  openssl \
  openssl-devel \
  readline \
  readline-devel \
  sqlite \
  sqlite-devel \
  zlib-devel \
  patch
$ curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
$ cat << 'EOS' >> ~/.bashrc
export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOS
$ source ~/.bashrc
$ pyenv install 2.7.1
$ pyenv global 2.7.1
$ pyenv rehash
$ pyenv versions 
  • pip をインストール
$ sudo yum -y install python-pip
  • PySpark インストール
$ pip install pyspark
  • spark.conf を設定する。
$ sudo vi /opt/apache-spark/spark-2.4.3-bin-spark-2.4.3-bin-hadoop2.8/conf/spark.conf
spark.hadoop.dynamodb.endpoint http://localhost:4569
spark.hadoop.fs.s3a.endpoint http://localhost:4572
spark.hadoop.fs.s3a.path.style.access true
spark.hadoop.fs.s3a.signing-algorithm S3SignerType

使ってみる

$ ./bin/gluepyspark

iPhone で紙をスキャンして PDF にする

iPhone で紙をスキャンして PDF にする方法。

  • [ファイル] アプリを開く。

  • 右上の […] - [書類をスキャン] を選択する。

  • 書類をスキャンして保存する。

AWS Lambda から Amazon RDS Proxy に IAM 認証する際のIAMポリシー設定例

AWS Lambda から Amazon RDS Proxy に IAM 認証する際のIAMポリシー設定例。以下のような IAM ポリシーを Lambda 実行用の IAM ロールにアタッチする。

  • IAM ポリシー例
    • リージョン: ap-northeast-1
    • AWSアカウントID: 234567890123
    • RDS Proxy の arn: arn:aws:rds:ap-northeast-1:234567890123:db-proxy:prx-0a4595437994303a9
    • DBユーザー名: awsuser
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:ap-northeast-1:234567890123:dbuser:prx-0a4595437994303a9/awsuser"
            ]
        }
    ]
}

Resource には RDS Proxy の arn ではなく "arn:aws:rds-db:[リージョン]:[AWSアカウントID]:dbuser:[RDS Proxy の arn の prx-** の部分]/[DBユーザー名]" を指定する。

参考

IAM ポリシーを変更することで、特定のユーザーにプロキシへのアクセスを許可できます。以下に例を示します。

"Resource": "arn:aws:rds-db:us-east-2:1234567890:dbuser:prx-ABCDEFGHIJKL01234/db_user"
Amazon RDS Proxy による接続の管理 - Amazon Relational Database Service

IAM Roleの設定次に、EC2に設定しているIAM Roleに対して、IAM接続用のポリシーを設定します。「Resouce」に設定する書式は次の通りです。 region、account-id、dbi-resource-id、database-user-nameについては利用環境のものを指定します。

arn:aws:rds-db:region:account-id:dbuser:dbi-resource-id/database-user-name

Tokyoリージョンで、「iam_user」というユーザの場合は、下記のようになります。(アカウントは12345678)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:ap-northeast-1:12345678:dbuser:cluster-XXXXXXXXXXXXXXXXXXXXXXXXXX/iam_user"
            ]
        }
    ]
}
IAM認証によるRDS接続を試してみた | DevelopersIO