Amazon Linuxでは、GUI向けのパッケージが提供されていませんでした。Headless Chromeはlibgtk3に依存しており、Amazon Linuxにlibgtk3をインストールするのに大変な手間が必要でした。 Amazon Linux 2になり、GUI向けのパッケージが提供され、Red Hat Enterprise Linux 7.4とほとんど変わらない手順でHeadless Chromeを動かせるようになりました。
Amazon Linux 2にHeadless Chromeをインストールしてみましょう。
EC2インスタンス 作成
Amazon Linux 2でAWS EC2インスタンスを作成します。
事前条件
AWSコマンドの設定が終わっているものとします。
- キーペア
chromium-on-amazon-linux2
- SSH接続可能なセキュリティグループ
sg-77d46f0e
があるとします。
EC2インスタンス 作成
aws ec2 run-instances --image-id ami-2a34b64c --count 1 --instance-type t2.micro --key-name chromium-on-amazon-linux2 --security-group-ids sg-77d46f0e
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-2a34b64c",
"InstanceId": "i-0f3efae9b9002b82e",
"InstanceType": "t2.micro",
"KeyName": "chromium-on-amazon-linux2",
"LaunchTime": "2018-01-10T06:11:19.000Z",
"Monitoring": {
"State": "disabled"
},
"Placement": {
"AvailabilityZone": "ap-northeast-1a",
"GroupName": "",
"Tenancy": "default"
},
"PrivateDnsName": "ip-172-31-6-102.ap-northeast-1.compute.internal",
"PrivateIpAddress": "172.31.6.102",
"ProductCodes": [],
"PublicDnsName": "",
"State": {
"Code": 0,
"Name": "pending"
},
"StateTransitionReason": "",
"SubnetId": "subnet-6bca3b1c",
"VpcId": "vpc-4c30c129",
"Architecture": "x86_64",
"BlockDeviceMappings": [],
"ClientToken": "",
"EbsOptimized": false,
"Hypervisor": "xen",
"NetworkInterfaces": [
{
"Attachment": {
"AttachTime": "2018-01-10T06:11:19.000Z",
"AttachmentId": "eni-attach-a2db2748",
"DeleteOnTermination": true,
"DeviceIndex": 0,
"Status": "attaching"
},
"Description": "",
"Groups": [
{
"GroupName": "launch-wizard-1",
"GroupId": "sg-77d46f0e"
}
],
"Ipv6Addresses": [],
"MacAddress": "06:31:39:4b:07:38",
"NetworkInterfaceId": "eni-e98d92d5",
"OwnerId": "016753510962",
"PrivateDnsName": "ip-172-31-6-102.ap-northeast-1.compute.internal",
"PrivateIpAddress": "172.31.6.102",
"PrivateIpAddresses": [
{
"Primary": true,
"PrivateDnsName": "ip-172-31-6-102.ap-northeast-1.compute.internal",
"PrivateIpAddress": "172.31.6.102"
}
],
"SourceDestCheck": true,
"Status": "in-use",
"SubnetId": "subnet-6bca3b1c",
"VpcId": "vpc-4c30c129"
}
],
"RootDeviceName": "/dev/xvda",
"RootDeviceType": "ebs",
"SecurityGroups": [
{
"GroupName": "launch-wizard-1",
"GroupId": "sg-77d46f0e"
}
],
"SourceDestCheck": true,
"StateReason": {
"Code": "pending",
"Message": "pending"
},
"VirtualizationType": "hvm"
}
],
"OwnerId": "016753510962",
"ReservationId": "r-0d34db4dcac25c65f"
}
次に生成されたEC2インスタンスにSSHでログインします。
SSH ログイン
PublicIpAddressはEC2インスタンス生成と同時には取得できません。
InstanceId
の値を使って、PublicIpAddressを取得します。
aws ec2 describe-instances --instance-ids i-0f3efae9b9002b82e
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-2a34b64c",
"InstanceId": "i-0f3efae9b9002b82e",
"InstanceType": "t2.micro",
"KeyName": "chromium-on-amazon-linux2",
"LaunchTime": "2018-01-10T06:11:19.000Z",
"Monitoring": {
"State": "disabled"
},
"Placement": {
"AvailabilityZone": "ap-northeast-1a",
"GroupName": "",
"Tenancy": "default"
},
"PrivateDnsName": "ip-172-31-6-102.ap-northeast-1.compute.internal",
"PrivateIpAddress": "172.31.6.102",
"ProductCodes": [],
"PublicDnsName": "ec2-13-230-156-244.ap-northeast-1.compute.amazonaws.com",
"PublicIpAddress": "13.230.156.244",
"State": {
"Code": 16,
"Name": "running"
},
"StateTransitionReason": "",
"SubnetId": "subnet-6bca3b1c",
"VpcId": "vpc-4c30c129",
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"AttachTime": "2018-01-10T06:11:20.000Z",
"DeleteOnTermination": true,
"Status": "attached",
"VolumeId": "vol-068a21bf8110a0b90"
}
}
],
"ClientToken": "",
"EbsOptimized": false,
"EnaSupport": true,
"Hypervisor": "xen",
"NetworkInterfaces": [
{
"Association": {
"IpOwnerId": "amazon",
"PublicDnsName": "ec2-13-230-156-244.ap-northeast-1.compute.amazonaws.com",
"PublicIp": "13.230.156.244"
},
"Attachment": {
"AttachTime": "2018-01-10T06:11:19.000Z",
"AttachmentId": "eni-attach-a2db2748",
"DeleteOnTermination": true,
"DeviceIndex": 0,
"Status": "attached"
},
"Description": "",
"Groups": [
{
"GroupName": "launch-wizard-1",
"GroupId": "sg-77d46f0e"
}
],
"Ipv6Addresses": [],
"MacAddress": "06:31:39:4b:07:38",
"NetworkInterfaceId": "eni-e98d92d5",
"OwnerId": "016753510962",
"PrivateDnsName": "ip-172-31-6-102.ap-northeast-1.compute.internal",
"PrivateIpAddress": "172.31.6.102",
"PrivateIpAddresses": [
{
"Association": {
"IpOwnerId": "amazon",
"PublicDnsName": "ec2-13-230-156-244.ap-northeast-1.compute.amazonaws.com",
"PublicIp": "13.230.156.244"
},
"Primary": true,
"PrivateDnsName": "ip-172-31-6-102.ap-northeast-1.compute.internal",
"PrivateIpAddress": "172.31.6.102"
}
],
"SourceDestCheck": true,
"Status": "in-use",
"SubnetId": "subnet-6bca3b1c",
"VpcId": "vpc-4c30c129"
}
],
"RootDeviceName": "/dev/xvda",
"RootDeviceType": "ebs",
"SecurityGroups": [
{
"GroupName": "launch-wizard-1",
"GroupId": "sg-77d46f0e"
}
],
"SourceDestCheck": true,
"VirtualizationType": "hvm"
}
],
"OwnerId": "016753510962",
"ReservationId": "r-0d34db4dcac25c65f"
}
]
}
ssh -i chromium-on-amazon-linux2.pem ec2-user@13.230.156.244
依存パッケージインストール
yumパッケージを更新します。
sudo yum update -y
Chromiumが依存するパッケージをインストールします。
sudo yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y
この部分が今までのAmazon Linuxで実現しようとすると、大変な手間が掛かっていました。Amazon Linux 2では設定なしで、yumコマンドでインストールできます。
参考:Installing Google Chrome On CentOS, Amazon Linux, or RHEL
Chromiumインストール
ここから少しズルをします。
GoogleChrome/puppeteer: Headless Chrome Node APIはインストール時に、自動的にChromiumのバイナリをダウンロードします。
これを使います。
Node.jsインストール
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum -y install nodejs
puppeteerインストール
npm init -y
npm i puppeteer
動作確認
次の内容のindex.jsを作ります。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// Get the "viewport" of the page, as reported by the page.
const dimensions = await page.evaluate(() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio
};
});
console.log('Dimensions:', dimensions);
await browser.close();
})();
node .
で、実行します。
Dimensions: { width: 800, height: 600, deviceScaleFactor: 1 }
が表示されれば成功です!!
後始末
使い終わったEC2インスタンスを削除します。
aws ec2 terminate-instances --instance-ids i-0f3efae9b9002b82e
Top comments (0)