ablog

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

Amazon DynamoDB Accelerator (DAX) のサンプル Java アプリを実行すると "Unsupported major.minor version 52.0" と怒られる

Java と DAX - Amazon DynamoDB のサンプルJavaアプリを実行したら、"Unsupported major.minor version 52.0" と怒られたので解決策をメモ。

事象

$ java TryDax
Exception in thread "main" java.lang.UnsupportedClassVersionError: TryDax : Unsupported major.minor version 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:808)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:443)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:65)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:349)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:348)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:430)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:323)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

解決策

  • Java のバージョンを確認
$ java -version
java version "1.7.0_201"
OpenJDK Runtime Environment (amzn-2.6.16.0.78.amzn1-x86_64 u201-b00)
OpenJDK 64-Bit Server VM (build 24.201-b00, mixed mode)
  • Java のバージョンを 1.8 に変更
$ sudo update-alternatives --config java

There are 2 programs which provide 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/bin/java

Enter to keep the current selection[+], or type selection number: 2
  • Javac は 1.8 だったのでそのまま
$ sudo update-alternatives --config javac

There is 1 program that provides 'javac'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/lib/jvm/java-1.8.0-openjdk.x86_64/bin/javac

Enter to keep the current selection[+], or type selection number: 1
$ javac TryDax*.java
warning: Supported source version 'RELEASE_7' from annotation processor 'com.amazonaws.eclipse.simpleworkflow.asynchrony.annotationprocessor.AsynchronyDeciderAnnotationProcessor' less than -source '1.8'
1 warning
  • サンプルアプリを実行する
$ java TryDax
Creating a DynamoDB client
Creating table...
Attempting to create table; please wait...
Sep 29, 2019 8:10:05 AM com.amazonaws.profile.path.cred.CredentialsLegacyConfigLocationProvider getLocation
WARNING: Found the legacy config profiles file at [/home/ec2-user/.aws/config]. Please move it to the latest default location [~/.aws/credentials].
Successfully created table.  Table status: ACTIVE
Populating table...
Writing data to the table...
Writing 10 items for partition key: 1
Writing 10 items for partition key: 2
Writing 10 items for partition key: 3
Writing 10 items for partition key: 4
Writing 10 items for partition key: 5
Writing 10 items for partition key: 6
Writing 10 items for partition key: 7
Writing 10 items for partition key: 8
Writing 10 items for partition key: 9
Writing 10 items for partition key: 10
Running GetItem, Scan, and Query tests...
First iteration of each test will result in cache misses
Next iterations are cache hits

GetItem test - partition key 1 and sort keys 1-10
	Total time: 76.314 ms - Avg time: 7.631 ms
	Total time: 61.295 ms - Avg time: 6.130 ms
	Total time: 72.975 ms - Avg time: 7.298 ms
	Total time: 53.670 ms - Avg time: 5.367 ms
	Total time: 50.510 ms - Avg time: 5.051 ms
Query test - partition key 5 and sort keys between 2 and 9
	Total time: 9.622 ms - Avg time: 1.924 ms
	Total time: 8.949 ms - Avg time: 1.790 ms
	Total time: 5.223 ms - Avg time: 1.045 ms
	Total time: 7.567 ms - Avg time: 1.513 ms
	Total time: 7.285 ms - Avg time: 1.457 ms
Scan test - all items in the table
	Total time: 28.724 ms - Avg time: 5.745 ms
	Total time: 19.273 ms - Avg time: 3.855 ms
	Total time: 14.883 ms - Avg time: 2.977 ms
	Total time: 16.374 ms - Avg time: 3.275 ms
	Total time: 18.015 ms - Avg time: 3.603 ms

Attempting to delete table; please wait...
Successfully deleted table.

AWS Service Catalog の IAMポリシー AWSServiceCatalogEndUserFullAccess と ServiceCatalogEndUserAccess の違い

AWS Service Catalog の IAMポリシー AWSServiceCatalogEndUserFullAccess とServiceCatalogEndUserAccess の違い

ドキュメント(日本語)

  • AWSServiceCatalogEndUserFullAccess — エンドユーザーコンソールビューへのフルアクセス権を付与します。製品を起動し、プロビジョニング済み製品を管理するアクセス権を付与します。
  • ServiceCatalogEndUserAccess — エンドユーザーコンソールビューへの読み取り専用アクセス権を付与します。製品を起動し、プロビジョニング済み製品を管理するアクセス権は付与しません。
AWS Service Catalog に対する認証とアクセスコントロール - AWS Service Catalog

ドキュメント(英語)

  • AWSServiceCatalogEndUserFullAccess — Grants full access to the end user console view. Grants permission to launch products and manage provisioned products.
  • ServiceCatalogEndUserAccess — Grants read-only access to the end user console view. Does not grant permission to launch products or manage provisioned products.
Authentication and Access Control for AWS Service Catalog - AWS Service Catalog

Athena で CloudTrail から S3 イベントを集計する

クエリ

select eventname, count(1) cnt from cloudtrail_logs
where eventsource = 's3.amazonaws.com' 
group by eventname
order by cnt desc

実行結果

eventname count
ListObjects 263702
PutObject 200075
GetObject 134911
HeadObject 83034
UploadPartCopy 24569
HeadBucket 11849
CopyObject 2492
CreateMultipartUpload 1903
CompleteMultipartUpload 1870
DeleteObject 1855
GetBucketPublicAccessBlock 207
GetBucketAcl 204
ListBuckets 200
UploadPart 198
GetAccountPublicAccessBlock 194
GetBucketPolicyStatus 191
GetBucketEncryption 180
SelectObjectContent 137
GetBucketVersioning 33
REST.GET.OBJECT_LOCK_CONFIGURATION 21
GetBucketWebsite 19
GetBucketPolicy 18
ListObjectVersions 16
DeleteObjects 15
GetBucketTagging 15
GetObjectAcl 14
CreateBucket 13
GetBucketCors 13
GetBucketLocation 12
GetBucketLogging 9
GetBucketNotification 9
GetBucketLifecycle 9
GetBucketRequestPayment 9
GetBucketReplication 9
DeleteBucket 4
PutBucketPublicAccessBlock 2
PutBucketPolicy 1
PutBucketEncryption 1
GetObjectTagging 1

Amazon Redshift の監査ログの種類

デフォルトで Amazon Redshift の監査ログは設定したバケットに以下のパスで出力されるが、

AWSLogs/AccountID/ServiceName/Region/Year/Month/Day/
AccountID_ServiceName_Region_ClusterName_LogType_Timestamp.gz

LogType は connectionlog、useractivitylog、userlog の3種類ある。

以下は実際のログから LogType を集計した結果。

$ aws s3 ls --recursive redshift-trail-bucket|perl -F/ -lane 'if(/AWSLogs\//){@array=split(q/_/,$F[$#F]);print $array[4]}'|sort|uniq -c
    279 connectionlog
    308 useractivitylog
      1 userlog

参考

Amazon Redshift 監査ログ作成のバケットの構造
デフォルトでは、Amazon Redshift は Amazon S3 バケット内のログファイルの整理に以下のバケットおよびオブジェクト構造を使用します。AWSLogs/AccountID/ServiceName/Region/Year/Month/Day/
AccountID_ServiceName_Region_ClusterName_LogType_Timestamp.gz
例: AWSLogs/123456789012/redshift/us-east-1/2013/10/29/123456789012_redshift_us-east-1_mycluster_userlog_2013-10-29T18:01.gz

Amazon S3 のキープレフィックスを指定すると、キーの冒頭にプレフィックスが挿入されます。
たとえば、myprefix のプレフィックスを指定する場合。myprefix/AWSLogs/123456789012/redshift/us-east-1/2013/10/29/123456789012_redshift_us-east-1_mycluster_userlog_2013-10-29T18:01.gz

Amazon S3 のキープレフィックスは 512 文字を超えることはできません。スペース ( )、二重引用符 (“)、一重引用符 (‘)、バックスラッシュ (\) を含めることはできません。また、許可されない特殊文字、および制御文字もいくつかあります。これらの文字の 16 進コードは次のとおりです。

  • x00 から x20
  • x 22
  • x 27
  • x5c
  • x7f 以上
データベース監査ログ作成 - Amazon Redshift

S3 のアクセスログのオペレーションを集計する

ちょっとした量のS3 のアクセスログのオペレーションを集計する。

$ aws s3 cp --recursive s3://s3-accesslog-az/ ./
  • オペレーションで集計する。
$ find . -type f -print0|xargs -0 -I{} perl -lane 'print $F[7]' {}|sort|uniq -c
    145 REST.GET.ACCELERATE
  20105 REST.GET.ACL
 143117 REST.GET.BUCKET
    178 REST.GET.BUCKETPOLICY
      1 REST.GET.BUCKETVERSIONS
    146 REST.GET.CORS
    104 REST.GET.ENCRYPTION
    145 REST.GET.LIFECYCLE
    144 REST.GET.LOCATION
    147 REST.GET.LOGGING_STATUS
    145 REST.GET.NOTIFICATION
 138823 REST.GET.OBJECT
    145 REST.GET.REPLICATION
    145 REST.GET.REQUEST_PAYMENT
    145 REST.GET.TAGGING
    146 REST.GET.VERSIONING
    147 REST.GET.WEBSITE
  17296 REST.HEAD.BUCKET
  56617 REST.HEAD.OBJECT
      1 REST.PUT.LOGGING_STATUS
 121313 REST.PUT.OBJECT

アカウント毎にアクセス可能な S3 Prefix を制御する S3 バケットポリシー例

やりたいこと

  • データレイクアカウントと連携相手の複数アカウントの間で1対多のクロスアカウントアクセス制御を行う。
  • 連携相手のアカウントから特定S3バケットの特定 prefix 以下のみへの Put/Get/Delete を許可。
  • 連携相手のアカウント毎に Put/Get/Delete 可能な prefix を分け、他アカウントの prefix 配下への Put/Get/Delete 禁止。
  • 自アカウントはVPCエンドポイント経由以外の Put/Get/Delete 禁止。
  • VPCエンドポイント経由以外の Put/Get/Delete 禁止。
  • VPCエンドポイント経由でも許可していないロールからの Put/Get/Delete 禁止。

バケットポリシー例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Access-to-specific-VPCE-only",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::test-123",
                "arn:aws:s3:::test-123/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:sourceVpce": [
                        "vpce-0e6************0a",
                        "vpce-02c************64",
                        "vpce-0a6************67"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/EC2RoleA"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::test-123/dir1/",
                "arn:aws:s3:::test-123/dir1/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "vpce-02c************64"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::234567890123:role/EC2RoleB"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::test-123/dir2/",
                "arn:aws:s3:::test-123/dir2/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "vpce-0a6************67"
                }
            }
        }
    ]
}

確認したこと

  • マネジメントコンソールから Put/Get/Delete できない(設定したVPCエンドポイント経由以外では不可)。以下はダウンロードしようとした場合。
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>867BA8F95B99B06C</RequestId>
<HostId>
ZY9qTP+1ulVOJjYw7gElnIv+BO+2kKE/7wTT6SAYqS3H3TdjFu+yJa9dFKOeRmKin3xumvzUtew=
</HostId>
</Error>
  • 設定しているVPCエンドポイント経由でもバケットポリシーで指定したIAMロール以外からは Put/Get/Delete 不可。
$  aws s3 cp foo s3://test-123/dir1/
upload failed: ./foo to s3://test-123/dir1/foo An error occurred (AccessDenied) when calling the PutObject operation: Access Denied